# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. module Qpid::Proton # Represents an endpoint for an AMQP connection.. # # An AMQP terminus acts as either a source or a target for messages, # but never as both. Every Link is associated iwth both a source and # a target Terminus that is negotiated during link establishment. # # A terminus is composed of an AMQP address along with a number of # other properties defining the quality of service and behavior of # the Link. # class Terminus include Util::Deprecation # Indicates a non-existent source or target terminus. UNSPECIFIED = Cproton::PN_UNSPECIFIED # Indicates a source for messages. SOURCE = Cproton::PN_SOURCE # Indicates a target for messages. TARGET = Cproton::PN_TARGET # A special target identifying a transaction coordinator. COORDINATOR = Cproton::PN_COORDINATOR # The terminus is orphaned when the parent link is closed. EXPIRE_WITH_LINK = Cproton::PN_EXPIRE_WITH_LINK # The terminus is orphaned whent he parent sessio is closed. EXPIRE_WITH_SESSION = Cproton::PN_EXPIRE_WITH_SESSION # The terminus is orphaned when the parent connection is closed. EXPIRE_WITH_CONNECTION = Cproton::PN_EXPIRE_WITH_CONNECTION # The terminus is never considered orphaned. EXPIRE_NEVER = Cproton::PN_EXPIRE_NEVER # Indicates a non-durable Terminus. NONDURABLE = Cproton::PN_NONDURABLE # Indicates a Terminus with durably held configuration, but # not the delivery state. CONFIGURATION = Cproton::PN_CONFIGURATION # Indicates a Terminus with both durably held configuration and # durably held delivery states. DELIVERIES = Cproton::PN_DELIVERIES # The behavior is defined by the nod.e DIST_MODE_UNSPECIFIED = Cproton::PN_DIST_MODE_UNSPECIFIED # The receiver gets all messages. DIST_MODE_COPY = Cproton::PN_DIST_MODE_COPY # The receives compete for messages. DIST_MODE_MOVE = Cproton::PN_DIST_MODE_MOVE # @private PROTON_METHOD_PREFIX = "pn_terminus" # @private extend Util::SWIGClassHelper # @!attribute type # # @return [Integer] The terminus type. # # @see SOURCE # @see TARGET # @see COORDINATOR # proton_set_get :type # @!attribute address # # @return [String] The terminus address. # proton_set_get :address # @!attribute durability_mode # # @return [Integer] The durability mode of the terminus. # # @see NONDURABLE # @see CONFIGURATION # @see DELIVERIES # proton_forward :durability_mode, :get_durability proton_forward :durability_mode=, :set_durability deprecated_alias :durability, :durability_mode deprecated_alias :durability=, :durability_mode= # @!attribute expiry_policy # # @return [Integer] The expiry policy. # # @see EXPIRE_WITH_LINK # @see EXPIRE_WITH_SESSION # @see EXPIRE_WITH_CONNECTION # @see EXPIRE_NEVER # proton_set_get :expiry_policy # @!attribute timeout # # @return [Integer] The timeout period. # proton_set_get :timeout # @!attribute dynamic? # # @return [Boolean] True if the terminus is dynamic. # proton_set_is :dynamic # @!attribute distribution_mode # # @return [Integer] The distribution mode. Only relevant for a message source. # # @see DIST_MODE_UNSPECIFIED # @see DIST_MODE_COPY # @see DIST_MODE_MOVE # proton_set_get :distribution_mode # @private include Util::ErrorHandler # @private attr_reader :impl # @private def initialize(impl) @impl = impl end # Access and modify the AMQP properties data for the Terminus. # # This operation will return an instance of Data that is valid until the # Terminus is freed due to its parent being freed. Any data contained in # the object will be sent as the AMQP properties for the parent Terminus # instance. # # NOTE: this MUST take the form of a symbol keyed map to be valid. # # @return [Data] The terminus properties. # def properties Codec::Data.new(Cproton.pn_terminus_properties(@impl)) end # Access and modify the AMQP capabilities data for the Terminus. # # This operation will return an instance of Data that is valid until the # Terminus is freed due to its parent being freed. Any data contained in # the object will be sent as the AMQP properties for the parent Terminus # instance. # # NOTE: this MUST take the form of a symbol keyed map to be valid. # # @return [Data] The terminus capabilities. # def capabilities Codec::Data.new(Cproton.pn_terminus_capabilities(@impl)) end # Access and modify the AMQP outcomes for the Terminus. # # This operaiton will return an instance of Data that is valid until the # Terminus is freed due to its parent being freed. Any data contained in # the object will be sent as the AMQP properties for the parent Terminus # instance. # # NOTE: this MUST take the form of a symbol keyed map to be valid. # # @return [Data] The terminus outcomes. # def outcomes Codec::Data.new(Cproton.pn_terminus_outcomes(@impl)) end # Access and modify the AMQP filter set for a source terminus. # Only relevant for a message source. # # This operation will return an instance of Data that is valid until the # Terminus is freed due to its parent being freed. Any data contained in # the object will be sent as the AMQP properties for the parent Terminus # instance. # # NOTE: this MUST take the form of a symbol keyed map to be valid. # # @return [Data] The terminus filter. # def filter Codec::Data.new(Cproton.pn_terminus_filter(@impl)) end # Replace the data in this Terminus with the contents of +other+ # @param other [Terminus] The other instance. def replace(other) Cproton.pn_terminus_copy(@impl, other.impl) self end deprecated_alias :copy, :replace # Apply options to this terminus. # @option opts [String] :address the node address # @option opts [Boolean] :dynamic (false) # if true, request a new node with a unique address to be created. +:address+ is ignored. # @option opts [Integer] :distribution_mode see {#distribution_mode}, only for source nodes # @option opts [Integer] :durability_mode see {#durability_mode} # @option opts [Integer] :timeout see {#timeout} # @option opts [Integer] :expiry_policy see {#expiry_policy} # @option opts [Hash] :filter see {#filter}, only for source nodes # @option opts [Hash] :capabilities see {#capabilities} def apply(opts=nil) return unless opts if opts.is_a? String # Shorthand for address self.address = opts else opts.each_pair do |k,v| case k when :address then self.address = v when :dynamic then self.dynamic = !!v when :distribution_mode then self.distribution_mode = v when :durability_mode then self.durability_mode = v when :timeout then self.timeout = v.round # Should be integer seconds when :expiry_policy then self.expiry_policy = v when :filter then self.filter << v when :capabilities then self.capabilities << v end end end end def inspect() "\#<#{self.class}: address=#{address.inspect} dynamic?=#{dynamic?.inspect}>" end def to_s() inspect; end can_raise_error([:type=, :address=, :durability=, :expiry_policy=, :timeout=, :dynamic=, :distribution_mode=, :copy], :error_class => Qpid::Proton::LinkError) end end