| # 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 |
| # |
| # 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 |
| # Allow a {Receiver} to indicate the status of a received message to the {Sender} |
| class Delivery < Transfer |
| def initialize(*args) super; @message = nil; end |
| |
| # @return [Receiver] The parent {Receiver} link. |
| def receiver() link; end |
| |
| # Accept the receiveed message. |
| def accept() settle ACCEPTED; end |
| |
| # Reject a message, indicating to the sender that is invalid and should |
| # never be delivered again to this or any other receiver. |
| def reject() settle REJECTED; end |
| |
| # Release a message, indicating to the sender that it was not processed |
| # but may be delivered again to this or another receiver. |
| # |
| # @param opts [Hash] Instructions to the sender to modify re-delivery. |
| # To allow re-delivery with no modifications at all use +release(nil)+ |
| # |
| # @option opts [Boolean] :failed (true) Instruct the sender to increase |
| # {Message#delivery_count} so future receivers will know there was a |
| # previous failed delivery. |
| # |
| # @option opts [Boolean] :undeliverable (false) Instruct the sender that this |
| # message should never be re-delivered to this receiver, although it may be |
| # delivered other receivers. |
| # |
| # @option opts [Hash] :annotations Instruct the sender to update the |
| # {Message#annotations} with these +key=>value+ pairs before re-delivery, |
| # replacing existing entries in {Message#annotations} with the same key. |
| def release(opts = nil) |
| opts = { :failed => false } if (opts == false) # deprecated |
| failed = !opts || opts.fetch(:failed, true) |
| undeliverable = opts && opts[:undeliverable] |
| annotations = opts && opts[:annotations] |
| annotations = nil if annotations && annotations.empty? |
| if failed || undeliverable || annotations |
| d = Cproton.pn_delivery_local(@impl) |
| Cproton.pn_disposition_set_failed(d, true) if failed |
| Cproton.pn_disposition_set_undeliverable(d, true) if undeliverable |
| Codec::Data.from_object(Cproton.pn_disposition_annotations(d), annotations) if annotations |
| settle(MODIFIED) |
| else |
| settle(RELEASED) |
| end |
| end |
| |
| # @deprecated use {#release} with modification options |
| def modify() |
| deprecated __method__, "release(modification_options)" |
| release failed=>true |
| end |
| |
| # @return [Boolean] True if the transfer was aborted by the sender. |
| proton_caller :aborted? |
| |
| # @return true if the incoming message is complete, call {#message} to retrieve it. |
| def complete?() readable? && !aborted? && !partial?; end |
| |
| # Get the message from the delivery. |
| # @return [Message] The message |
| # @raise [AbortedError] if the message has been aborted (check with {#aborted?} |
| # @raise [UnderflowError] if the message is incomplete (check with {#complete?} |
| # @raise [::ArgumentError] if the delivery is not the current delivery on a receiving link. |
| def message |
| unless @message |
| raise AbortedError, "message aborted by sender" if aborted? |
| raise UnderflowError, "incoming message incomplete" if partial? |
| raise ArgumentError, "no incoming message" unless readable? |
| @message = Message.new |
| @message.decode(link.receive(pending)) |
| link.advance |
| end |
| @message |
| end |
| end |
| end |