blob: f7f7d675fb68dec1924cb9a4dc12724d7625dc15 [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 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