| # 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 listener for incoming connections. |
| # |
| # Create with {Container#listen} or {Container#listen_io}. |
| # To control the handler and connection options applied to incoming connections, |
| # pass a {ListenerHandler} on creation. |
| # |
| class Listener |
| |
| # Class that handles listener events and provides options for accepted |
| # connections. This class simply returns a fixed set of options for every |
| # connection accepted, but you can subclass and override all of the on_ |
| # methods to provide more interesting behaviour. |
| # |
| # *Note*: If a {Listener} method raises an exception, it will stop the {Container} |
| # that the handler is running in. See {Container#run} |
| class Handler |
| # @param opts [Hash] Options to return from on_accept. |
| def initialize(opts=nil) @opts = opts || {}; end |
| |
| # Called when the listener is ready to accept connections. |
| # @param listener [Listener] The listener |
| def on_open(listener) end |
| |
| # Called if an error occurs. |
| # If there is an error while opening the listener, this method is |
| # called and {#on_open} is not |
| # @param listener [Listener] |
| # @param what [Condition] Information about the error. |
| def on_error(listener, what) end |
| |
| # Called when a listener accepts a new connection. |
| # @param listener [Listener] The listener |
| # @return [Hash] Options to apply to the incoming connection, see {#connect} |
| def on_accept(listener) @opts; end |
| |
| # Called when the listener closes. |
| # @param listener [Listener] The listener accepting the connection. |
| def on_close(listener) end |
| end |
| |
| # @return [Container] The listener's container |
| attr_reader :container |
| |
| # @return [Condition] The error condition if there is one |
| attr_reader :condition |
| |
| # Initiate closing the the listener. |
| # It will not be fully {#closed?} until its {Handler#on_close} is called by the {Container} |
| # @param error [Condition] Optional error condition. |
| def close(error=nil) |
| return if closed? || @closing |
| @closing = true |
| @condition ||= Condition.convert error |
| @io.close_read rescue nil # Force Container IO.select to wake with listener readable. |
| nil |
| end |
| |
| # Get the {IO} server socket used by the listener |
| def to_io() @io; end |
| |
| # Get the IP port used by the listener |
| def port() to_io.addr[1]; end |
| |
| # True if the listening socket is fully closed |
| def closed?() @io.closed?; end |
| |
| private # Called by {Container} |
| |
| def initialize(io, container) |
| @io = io |
| @container = container |
| @closing = nil |
| end |
| end |
| end |