Class: NetworkClipboard::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/network_clipboard/client.rb

Constant Summary collapse

LOGGER =
Logger.new(STDOUT)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeClient

Returns a new instance of Client.



22
23
24
25
26
27
28
# File 'lib/network_clipboard/client.rb', line 22

def initialize
  @config = Config.new
  @discovery = Discovery.new(@config)
  @tcp_server = TCPServer.new(@config.port)
  @connections = {}
  @running = true
end

Instance Attribute Details

#running=(value) ⇒ Object (writeonly)

Sets the attribute running

Parameters:

  • value

    the value to set the attribute running to.



14
15
16
# File 'lib/network_clipboard/client.rb', line 14

def running=(value)
  @running = value
end

Class Method Details

.runObject



16
17
18
19
20
# File 'lib/network_clipboard/client.rb', line 16

def self.run
  c = Client.new
  Signal.trap('INT'){c.running = false}
  c.loop
end

Instance Method Details

#announceObject



68
69
70
# File 'lib/network_clipboard/client.rb', line 68

def announce
  @discovery.announce
end

#discoverObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/network_clipboard/client.rb', line 72

def discover
  @discovery.get_peer_announcements do |remote_client_id,address|
    next if @connections[remote_client_id] or remote_client_id < @config.client_id
    LOGGER.info("New Peer -> #{remote_client_id}")

    aes_connection = AESConnection.new(@config,TCPSocket.new(address,@config.port))

    if aes_connection.remote_client_id != remote_client_id
      LOGGER.error("Client Id #{aes_connection.remote_client_id} doesn't match original value #{remote_client_id}")
      aes_connection.close
      next
    end
      
    if @connections[aes_connection.remote_client_id]
      LOGGER.error("Duplicate connections #{aes_connection} and #{@connections[aes_connection.remote_client_id]}")
      aes_connection.close
      next
    end

    @connections[aes_connection.remote_client_id] = aes_connection
  end
end

#fetch_clipboardObject



44
45
46
# File 'lib/network_clipboard/client.rb', line 44

def fetch_clipboard
  update_clipboard(Clipboard.paste)
end

#find_incomingObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/network_clipboard/client.rb', line 95

def find_incoming
  while true
    begin
      incoming = @tcp_server.accept_nonblock
    rescue IO::WaitReadable
      return
    end
    aes_connection = AESConnection.new(@config,incoming)
    LOGGER.info("New Peer <- #{aes_connection.remote_client_id}")

    if @connections[aes_connection.remote_client_id]
      aes_connection.close
      next
    end

    @connections[aes_connection.remote_client_id] = aes_connection
  end
end

#loopObject



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/network_clipboard/client.rb', line 30

def loop
  while @running
    [:announce,
     :discover,
     :watch_incoming,
     :fetch_clipboard,
     :find_incoming,
     :wait,
    ].each do |action|
      send(action) if @running
    end
  end
end

#receive_clipboard(connection) ⇒ Object



63
64
65
66
# File 'lib/network_clipboard/client.rb', line 63

def receive_clipboard(connection)
  inbound = connection.receive(false)
  Clipboard.copy(inbound) if inbound
end

#send_new_clipboard(connection) ⇒ Object



55
56
57
# File 'lib/network_clipboard/client.rb', line 55

def send_new_clipboard(connection)
  connection.send(@new_value)
end

#update_clipboard(new_value) ⇒ Object



48
49
50
51
52
53
# File 'lib/network_clipboard/client.rb', line 48

def update_clipboard(new_value)
  @new_value,@last_value = new_value,@new_value
  if @new_value != @last_value
    @connections.values.each{|c| send_new_clipboard(c)}
  end
end

#waitObject



114
115
116
117
118
119
# File 'lib/network_clipboard/client.rb', line 114

def wait
  return IO.select([
    @discovery.receive_socket,
    @tcp_server,
  ] + @connections.values.collect(&:socket), [], [], 5)
end

#watch_incomingObject



59
60
61
# File 'lib/network_clipboard/client.rb', line 59

def watch_incoming
  @connections.values.each{|c| receive_clipboard(c)}
end