1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- from xmlrpc.client import ServerProxy, Fault
- from server import Node, UNHANDLED
- from client import random_string
- from threading import Thread
- from time import sleep
- from os import listdir
- import sys
- import tkinter as tk
- HEAD_START = 0.1 # Seconds
- SECRET_LENGTH = 100
- class ListableNode(Node):
- def list(self):
- return listdir(self.dirname)
- class Client(tk.Frame):
- def __init__(self, master, url, dirname, urlfile):
- super().__init__(master)
- self.node_setup(url, dirname, urlfile)
- self.pack()
- self.create_widgets()
- def node_setup(self, url, dirname, urlfile):
- self.secret = random_string(SECRET_LENGTH)
- n = ListableNode(url, dirname, self.secret)
- t = Thread(target=n._start)
- t.setDaemon(1)
- t.start()
- # Give the server a head start:
- sleep(HEAD_START)
- self.server = ServerProxy(url)
- for line in open(urlfile):
- line = line.strip()
- self.server.hello(line)
- def create_widgets(self):
- self.input = input = tk.Entry(self)
- input.pack(side='left')
- self.submit = submit = tk.Button(self)
- submit['text'] = "Fetch"
- submit['command'] = self.fetch_handler
- submit.pack()
- self.files = files = tk.Listbox()
- files.pack(side='bottom', expand=True, fill=tk.BOTH)
- self.update_list()
- def fetch_handler(self):
- query = self.input.get()
- try:
- self.server.fetch(query, self.secret)
- self.update_list()
- except Fault as f:
- if f.faultCode != UNHANDLED: raise
- print("Couldn't find the file", query)
- def update_list(self):
- self.files.delete(0, tk.END)
- self.files.insert(tk.END, self.server.list())
- def main():
- urlfile, directory, url = sys.argv[1:]
- root = tk.Tk()
- root.title("File Sharing Client")
- client = Client(root, url, directory, urlfile)
- client.mainloop()
- if __name__ == '__main__': main()
|