blob: 2c9c3a10435205a52274bf4c7363ed3f170b3657 [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
# A session is the parent for senders and receivers.
#
# A Session has a single parent Qpid::Proton::Connection instance.
#
class Session < Endpoint
# @private
include Util::Wrapper
# @private
include Util::SwigHelper
# @private
PROTON_METHOD_PREFIX = "pn_session"
# @!attribute incoming_capacity
#
# The incoming capacity of a session determines how much incoming message
# data the session will buffer. Note that if this value is less than the
# negotatied frame size of the transport, it will be rounded up to one full
# frame.
#
# @return [Fixnum] The incoing capacity of the session, measured in bytes.
#
proton_accessor :incoming_capacity
# @private
proton_reader :attachments
# @!attribute [r] outgoing_bytes
#
# @return [Fixnum] The number of outgoing bytes currently being buffered.
#
proton_caller :outgoing_bytes
# @!attribute [r] incoming_bytes
#
# @return [Fixnum] The number of incomign bytes currently being buffered.
#
proton_caller :incoming_bytes
# @!method open
# Opens the session.
#
# Once this operaton has completed, the state flag is updated.
#
# @see LOCAL_ACTIVE
#
proton_caller :open
# @!attribute [r] state
#
# @return [Fixnum] The endpoint state.
#
proton_caller :state
# @private
def self.wrap(impl)
return nil if impl.nil?
self.fetch_instance(impl, :pn_session_attachments) || Session.new(impl)
end
# @private
def initialize(impl)
@impl = impl
self.class.store_instance(self, :pn_session_attachments)
end
# Closed the session.
#
# Once this operation has completed, the state flag will be set. This may be
# called without calling #open, in which case it is the equivalence of
# calling #open and then close immediately.
#
def close
self._update_condition
Cproton.pn_session_close(@impl)
end
# Retrieves the next session from a given connection that matches the
# specified state mask.
#
# When uses with Connection#session_head an application can access all of
# the session son the connection that match the given state.
#
# @param state_mask [Fixnum] The state mask to match.
#
# @return [Session, nil] The next session if one matches, or nil.
#
def next(state_mask)
Session.wrap(Cproton.pn_session_next(@impl, state_mask))
end
# Returns the parent connection.
#
# @return [Connection] The connection.
#
def connection
Connection.wrap(Cproton.pn_session_connection(@impl))
end
# Constructs a new sender.
#
# Each sender between two AMQP containers must be uniquely named. Note that
# this uniqueness cannot be enforced at the library level, so some
# consideration should be taken in choosing link names.
#
# @param name [String] The link name.
#
# @return [Sender, nil] The sender, or nil if an error occurred.
#
def sender(name)
Sender.new(Cproton.pn_sender(@impl, name))
end
# Constructs a new receiver.
#
# Each receiver between two AMQP containers must be uniquely named. Note
# that this uniqueness cannot be enforced at the library level, so some
# consideration should be taken in choosing link names.
#
# @param name [String] The link name.
#
# @return [Receiver, nil] The receiver, or nil if an error occurred.
#
def receiver(name)
Receiver.new(Cproton.pn_receiver(@impl, name))
end
# @private
def _local_condition
Cproton.pn_session_condition(@impl)
end
# @private
def _remote_condition # :nodoc:
Cproton.pn_session_remote_condition(@impl)
end
end
end