class Rabbiter::Client::GLibConnection

Public Class Methods

new(logger, handler) click to toggle source
# File lib/rabbiter.rb, line 146
def initialize(logger, handler)
  @logger = logger
  @handler = handler
  @options = @handler.instance_variable_get("@options")
  @client = nil
  @connection = nil
  @socket = nil
  @source_ids = []
end

Public Instance Methods

close() click to toggle source
# File lib/rabbiter.rb, line 217
def close
  return if @client.nil?
  @source_ids.reject! do |id|
    GLib::Source.remove(id)
    true
  end
  @socket.close
  @socket = nil
  @input = nil
  @output = nil
  @connection = nil
  @client = nil
end
connect() click to toggle source
# File lib/rabbiter.rb, line 156
      def connect
        close
        @client = Gio::SocketClient.new
        @client.tls = @options[:ssl]
        @client.tls_validation_flags = :validate_all
#        if Rabbit::Utils.windows?
          @client.tls_validation_flags -= :unknown_ca
#        end
        @connection = @client.connect_to_host(@options[:host], @options[:port])
        @socket = @connection.socket
        @socket.blocking = false
        @input = @connection.input_stream
        @output = @connection.output_stream

        reader_source = @socket.create_source(:in) do |socket, condition|
          @logger.debug("[twitter][read][start]")
          data = @input.read(8192) || ""
          @logger.debug("[twitter][read][done] #{data.bytesize}")
          if data.empty?
            @source_ids.reject! {|id| id == reader_source.id}
            @logger.debug("[twitter][read][eof]")
            false
          else
            @handler.receive_data(data)
            true
          end
        end
        @source_ids << reader_source.attach

        error_source = @socket.create_source(:err) do |socket, condition|
          @handler.send(:receive_error, condition)
          true
        end
        @source_ids << error_source.attach

        @handler.extend(GLibAdapter)
        @handler.connection = self
        @handler.connection_completed
      end
reconnect(options={}) click to toggle source
# File lib/rabbiter.rb, line 231
def reconnect(options={})
  close
  after = options[:after] || 0
  if after.zero?
    connect
  else
    id = GLib::Timeout.add(after) do
      connect
      false
    end
    @source_ids << id
  end
end
send_data(data) click to toggle source
# File lib/rabbiter.rb, line 196
def send_data(data)
  rest = data.bytesize
  writer_source = @socket.create_source(:out) do |socket, condition|
    if rest.zero?
      @logger.debug("[twitter][flush][start]")
      @output.flush
      @logger.debug("[twitter][flush][done]")
      @source_ids.reject! {|id| id == writer_source.id}
      false
    else
      @logger.debug("[twitter][write][start]")
      written_size = @output.write(data)
      @logger.debug("[twitter][write][done] #{written_size}")
      rest -= written_size
      data[0, written_size] = ""
      true
    end
  end
  @source_ids << writer_source.attach
end