blob: ff035cb3fd565411fc39dbf809c4d8c49c18781a [file] [log] [blame]
# 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
# The sending endpoint.
#
# @see Receiver
#
class Sender < Link
# @private
include Util::ErrorHandler
# Open the {Sender} link
#
# @overload open_sender(address)
# @param address [String] address of the target to send to
# @overload open_sender(opts)
# @option opts [Boolean] :auto_settle (true) if true, automatically settle transfers
# @option opts [Boolean] :dynamic (false) dynamic property for source {Terminus#dynamic}
# @option opts [String,Hash] :source source address or source options, see {Terminus#apply}
# @option opts [String,Hash] :target target address or target options, see {Terminus#apply}
# @option opts [String] :name (generated) unique name for the link.
def open(opts=nil)
opts = { :target => opts } if opts.is_a? String
opts ||= {}
target.apply opts[:target]
source.apply opts[:source]
target.dynamic = !!opts[:dynamic]
@auto_settle = opts.fetch(:auto_settle, true)
super()
self
end
# @return [Boolean] auto_settle flag, see {#open}
attr_reader :auto_settle
# Hint to the remote receiver about the number of messages available.
# The receiver may use this to optimize credit flow, or may ignore it.
# @param n [Integer] The number of deliveries potentially available.
def offered(n)
Cproton.pn_link_offered(@impl, n)
end
# TODO aconway 2017-12-05: incompatible, used to return bytes sent.
# @!method send(message)
# Send a message.
# @param message [Message] The message to send.
# @return [Tracker] Tracks the outcome of the message.
def send(message, *args)
tag = nil
if args.size > 0
# deprecated: allow tag in args[0] for backwards compat
raise ArgumentError("too many arguments") if args.size > 1
tag = args[0]
end
tag ||= next_tag
t = Tracker.new(Cproton.pn_delivery(@impl, tag))
Cproton.pn_link_send(@impl, message.encode)
Cproton.pn_link_advance(@impl)
t.settle if snd_settle_mode == SND_SETTLED
return t
end
# @deprecated use {#send}
def stream(bytes)
deprecated __method__, "send"
Cproton.pn_link_send(@impl, bytes)
end
# @deprecated internal use only
def delivery_tag() deprecated(__method__); next_tag; end
private
def initialize(*arg) super; @tag_count = 0; end
def next_tag() (@tag_count += 1).to_s(32); end
can_raise_error :stream, :error_class => Qpid::Proton::LinkError
end
end