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