#-- # 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 # Selectable enables accessing the underlying file descriptors # for Messenger. # # @private class Selectable # @private include Util::SwigHelper # @private PROTON_METHOD_PREFIX = "pn_selectable" # Returns the underlying file descriptor. # # This can be used in conjunction with the IO class. # def fileno Cproton.pn_selectable_get_fd(@impl) end proton_reader :reading, :is_or_get => :is proton_reader :writing, :is_or_get => :is proton_caller :readable proton_caller :writable proton_caller :expired proton_accessor :registered, :is_or_get => :is proton_accessor :terminal, :is_or_get => :is proton_caller :terminate proton_caller :release # @private def self.wrap(impl) return nil if impl.nil? self.fetch_instance(impl, :pn_selectable_attachments) || Selectable.new(impl) end # @private include Util::Wrapper # @private def initialize(impl) @impl = impl self.class.store_instance(self, :pn_selectable_attachments) end private DEFAULT = Object.new public def fileno(fd = DEFAULT) if fd == DEFAULT Cproton.pn_selectable_get_fd(@impl) elsif fd.nil? Cproton.pn_selectable_set_fd(@impl, Cproton::PN_INVALID_SOCKET) else Cproton.pn_selectable_set_fd(@impl, fd) end end def reading=(reading) if reading.nil? reading = false elsif reading == "0" reading = false else reading = true end Cproton.pn_selectable_set_reading(@impl, reading ? true : false) end def writing=(writing) if writing.nil? writing = false elsif writing == "0" writing = false else writing = true end Cproton.pn_selectable_set_writing(@impl, writing ? true : false) end def deadline tstamp = Cproton.pn_selectable_get_deadline(@impl) return nil if tstamp.nil? mills_to_sec(tstamp) end def deadline=(deadline) Cproton.pn_selectable_set_deadline(sec_to_millis(deadline)) end def to_io @io ||= IO.new(fileno) end end end