class Libvirt::Stream

Constants

EVENT_READABLE
EVENT_WRITABLE
NONBLOCK

Public Class Methods

new(stream_ptr) click to toggle source
# File lib/libvirt/stream.rb, line 9
def initialize(stream_ptr)
  @stream_ptr = stream_ptr
  @cb = nil
  @opaque = nil

  free = ->(obj_id) do
    Util.log(:debug) { "Finalize Libvirt::Stream 0x#{obj_id.to_s(16)} @stream_ptr=#{@stream_ptr}, @cb=#{@cb}, @opaque=#{@opaque}," }
    return unless @stream_ptr

    if @cb
      rcb_result = FFI::Stream.virStreamEventRemoveCallback(@stream_ptr)
      warn("Couldn't remove callback Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if rcb_result.negative?
      ab_result = FFI::Stream.virStreamAbort(@stream_ptr)
      warn("Couldn't abort Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if ab_result.negative?
    end
    fr_result = FFI::Stream.virStreamFree(@stream_ptr)
    warn("Couldn't free Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if fr_result.negative?
  end
  ObjectSpace.define_finalizer(self, free)
end

Public Instance Methods

abort_stream() click to toggle source
# File lib/libvirt/stream.rb, line 84
def abort_stream
  result = FFI::Stream.virStreamAbort(@stream_ptr)
  raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?

  @cb = nil
  @opaque = nil
end
event_add_callback(events, opaque, &block) click to toggle source

@param events [Integer] bit OR of EVENT_READABLE, EVENT_READABLE @param opaque [Object] @yield [Stream]

# File lib/libvirt/stream.rb, line 37
def event_add_callback(events, opaque, &block)
  dbg { "#event_add_callback events=#{events}, opaque=#{opaque}" }

  raise Errors::LibError, 'callback already added' unless @cb.nil?

  @opaque = opaque
  @cb = FFI::Stream.callback_function(:virStreamEventCallback) do |_stream_ptr, evs, _op|
    # stream = Stream.new(stream_ptr)
    block.call(self, evs, @opaque)
  end

  result = FFI::Stream.virStreamEventAddCallback(@stream_ptr, events, @cb, nil, nil)
  raise Errors::LibError, "Couldn't add stream event callback" if result.negative?

  true
end
event_remove_callback() click to toggle source
# File lib/libvirt/stream.rb, line 64
def event_remove_callback
  dbg { '#event_remove_callback' }

  result = FFI::Stream.virStreamEventRemoveCallback(@stream_ptr)
  raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?

  opaque = @opaque
  @cb = nil
  @opaque = nil
  opaque
end
event_update_callback(events) click to toggle source

@param events [Integer] bit OR of EVENT_READABLE, EVENT_READABLE

# File lib/libvirt/stream.rb, line 55
def event_update_callback(events)
  dbg { "#event_update_callback events=#{events}" }

  result = FFI::Stream.virStreamEventUpdateCallback(@stream_ptr, events)
  raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?

  true
end
finish() click to toggle source
# File lib/libvirt/stream.rb, line 76
def finish
  result = FFI::Stream.virStreamFinish(@stream_ptr)
  raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?

  @cb = nil
  @opaque = nil
end
free_stream() click to toggle source
# File lib/libvirt/stream.rb, line 92
def free_stream
  result = FFI::Stream.virStreamFree(@stream_ptr)
  raise Errors::LibError, "Couldn't free stream event callback" if result.negative?

  @cb = nil
  @opaque = nil
  @stream_ptr = nil
end
recv(bytes) click to toggle source
# File lib/libvirt/stream.rb, line 101
def recv(bytes)
  buffer = ::FFI::MemoryPointer.new(:char, bytes)
  result = FFI::Stream.virStreamRecv(@stream_ptr, buffer, bytes)
  if result == -1
    abort_stream
    [-1, nil]
  elsif result.zero?
    [0, nil]
  elsif result == -2
    [-2, nil]
  elsif result.positive?
    [result, buffer.read_bytes(result)]
  else
    raise Errors::LibError, "Invalid response from virStreamRecv #{result.inspect}"
  end
end
to_ptr() click to toggle source
# File lib/libvirt/stream.rb, line 30
def to_ptr
  @stream_ptr
end

Private Instance Methods

dbg(&block) click to toggle source
# File lib/libvirt/stream.rb, line 120
def dbg(&block)
  Util.log(:debug, 'Libvirt::Stream', &block)
end