#
# 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

  module Messaging

    # Sender defines a type for sending messages.
    class Sender

      def initialize(sender_impl) # :nodoc:
        @sender_impl = sender_impl
      end

      def sender_impl # :nodoc:
        @sender_impl
      end

      # Sends a message.
      def send(message, args = {})
        block = args[:block] || false
        @sender_impl.send message.message_impl, block
      end

      # Closes the sender.
      def close; @sender_impl.close; end

      # Returns the name for the sender.
      def name; @sender_impl.getName; end

      # Sets the capacity for the sender, which is the number of outgoing
      # messages that can be held pending confirmation or receipt by
      # the broker.
      def capacity=(capacity); @sender_impl.setCapacity capacity; end

      # Returns the capacity.
      def capacity; @sender_impl.getCapacity; end

      # Returns the number of messages sent that are pending receipt
      # confirmation by the broker.
      def unsettled; @sender_impl.getUnsettled; end

      # Returns the available capacity for sending messages.
      def available
        @sender_impl.getAvailable
      end

      # Returns the Session for this sender.
      def session; Qpid::Messaging::Session.new @sender_impl.getSession; end

      # Returns if the underlying sender is valid.
      def valid?; @sender_impl.isValid; end

      # Returns if the underlying sender is null.
      def null?; @sender_impl.isNull; end

      def swap sender
        @sender_impl.swap sender.sender_impl
      end

    end

  end

end

