Class: NetworkClipboard::Client
- Inherits:
-
Object
- Object
- NetworkClipboard::Client
- Defined in:
- lib/network_clipboard/client.rb
Constant Summary collapse
- LOGGER =
Logger.new(STDOUT)
Instance Attribute Summary collapse
-
#running ⇒ Object
writeonly
Sets the attribute running.
Class Method Summary collapse
Instance Method Summary collapse
- #announce ⇒ Object
- #discover ⇒ Object
- #fetch_clipboard ⇒ Object
- #find_incoming ⇒ Object
-
#initialize ⇒ Client
constructor
A new instance of Client.
- #loop ⇒ Object
- #receive_clipboard(connection) ⇒ Object
- #send_new_clipboard(connection) ⇒ Object
- #update_clipboard(new_value) ⇒ Object
- #wait ⇒ Object
- #watch_incoming ⇒ Object
Constructor Details
#initialize ⇒ Client
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
14 15 16 |
# File 'lib/network_clipboard/client.rb', line 14 def running=(value) @running = value end |
Class Method Details
.run ⇒ Object
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
#announce ⇒ Object
68 69 70 |
# File 'lib/network_clipboard/client.rb', line 68 def announce @discovery.announce end |
#discover ⇒ Object
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_clipboard ⇒ Object
44 45 46 |
# File 'lib/network_clipboard/client.rb', line 44 def fetch_clipboard update_clipboard(Clipboard.paste) end |
#find_incoming ⇒ Object
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 |
#loop ⇒ Object
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 |
#wait ⇒ Object
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_incoming ⇒ Object
59 60 61 |
# File 'lib/network_clipboard/client.rb', line 59 def watch_incoming @connections.values.each{|c| receive_clipboard(c)} end |