ruby/lib/core/session.rb (68 lines of code) (raw):

# 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 include Util::Deprecation # @private PROTON_METHOD_PREFIX = "pn_session" # @private include Util::Wrapper # @!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 [Integer] The incoing capacity of the session, measured in bytes. # proton_set_get :incoming_capacity # @private proton_get :attachments # @!attribute [r] outgoing_bytes # # @return [Integer] The number of outgoing bytes currently being buffered. # proton_caller :outgoing_bytes # @!attribute [r] incoming_bytes # # @return [Integer] The number of incomign bytes currently being buffered. # proton_caller :incoming_bytes # Open the session proton_caller :open # @!attribute [r] state # # @return [Integer] 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 # Close the local end of the session. The remote end may or may not be closed. # @param error [Condition] Optional error condition to send with the close. def close(error=nil) Condition.assign(_local_condition, error) Cproton.pn_session_close(@impl) end # @deprecated use {Connection#each_session} def next(state_mask) deprecated __method__, "Connection#each_session" 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 # @deprecated use {#open_sender} def sender(name) deprecated __method__, "open_sender" Sender.new(Cproton.pn_sender(@impl, name)); end # @deprecated use {#open_receiver} def receiver(name) deprecated __method__, "open_receiver" Receiver.new(Cproton.pn_receiver(@impl, name)) end # Create and open a {Receiver} link, see {Receiver#open} # @param opts [Hash] receiver options, see {Receiver#open} # @return [Receiver] def open_receiver(opts=nil) Receiver.new(Cproton.pn_receiver(@impl, link_name(opts))).open(opts) end # Create and open a {Sender} link, see {#open} # @param opts [Hash] sender options, see {Sender#open} # @return [Sender] def open_sender(opts=nil) Sender.new(Cproton.pn_sender(@impl, link_name(opts))).open(opts) end # Get the links on this Session. # @overload each_link # @yieldparam l [Link] pass each link to block # @overload each_link # @return [Enumerator] enumerator over links def each_link return enum_for(:each_link) unless block_given? l = Cproton.pn_link_head(Cproton.pn_session_connection(@impl), 0); while l link = Link.wrap(l) yield link if link.session == self l = Cproton.pn_link_next(l, 0) end self end # Get the {Sender} links - see {#each_link} def each_sender() each_link.select { |l| l.sender? }; end # Get the {Receiver} links - see {#each_link} def each_receiver() each_link.select { |l| l.receiver? }; end private def link_name(opts) (opts.respond_to?(:to_hash) && opts[:name]) || connection.link_name end def _local_condition Cproton.pn_session_condition(@impl) end def _remote_condition # :nodoc: Cproton.pn_session_remote_condition(@impl) end end end