Client skeleton added.
4 from operator import attrgetter
8 def help(socket, client, worker):
9 socket.sendto("\n".join([key + ": " + value[1]
10 for key, value in commands.iteritems()]) + "\n", client)
12 def createModel(socket, client, worker, (name,)):
13 model.createModel(name)
14 socket.sendto("model %s created\n" % name, client)
16 def deleteModel(socket, client, worker, (name,)):
17 if model.deleteModel(name):
18 socket.sendto("model %s deleted\n" % name, client)
20 def saveModel(socket, client, worker, (name,)):
21 model = lookupModel(socket, client, name)
23 pickle.dump(model, open(name + ".model", "w"))
24 socket.sendto("model %s saved\n" % name, client)
26 def loadModel(socket, client, worker, (name,)):
27 model.addModel(pickle.load(open(name + ".model", "r")))
28 socket.sendto("model %s loaded\n" % name, client)
31 if name in model.models:
32 return model.models[name]
34 def lookupModel(socket, client, name):
35 if name not in model.models:
36 socket.sendto("model %s not found\n" % name, client)
39 return model.models[name]
41 def addObserver(socket, client, worker, (modelName, eventType)):
42 model = lookupModel(socket, client, modelName)
44 model.register(socket, client, eventType)
45 socket.sendto("observer for event type %s added: " % eventType
46 + str(client) + "\n", client)
47 print "observer for event type %s added: " % eventType + str(client) + "\n"
49 def setResolution(socket, client, worker, (modelName, x, y)):
50 model = lookupModel(socket, client, modelName)
52 model.setResolution(int(x), int(y))
53 socket.sendto("model %s resolution set to %s, %s\n" %
54 (modelName, x, y), client)
56 def setRange(socket, client, worker, (modelName, begin, end)):
57 model = lookupModel(socket, client, modelName)
59 model.setRange(complex(begin), complex(end))
60 socket.sendto("model %s range set to %s, %s\n" %
61 (modelName, begin, end), client)
63 def update(socket, client, worker, (modelName, iterations)):
64 model = lookupModel(socket, client, modelName)
66 old_res = model.resolution
67 begin_y = model.range[0].imag
68 end_y = model.range[1].imag
69 begin_x = model.range[0].real
70 end_x = model.range[1].real
71 step_x = (end_x - begin_x) / len(worker)
72 model.resolution = (old_res[0] / len(worker), old_res[1])
74 for i, w in enumerate(worker):
75 new_begin_x = begin_x + step_x * i
76 new_end_x = begin_x + step_x * (i + 1)
77 model.range = (complex(new_begin_x, begin_y),
78 complex(new_end_x, end_y))
80 print model.resolution
82 dump = pickle.dumps(model)
83 socket.sendto("%010i%s%010i" % (len(dump), dump,
85 socket.sendto("model %s updated with max %s iterations\n"
86 % (modelName, iterations), client)
87 model.range = (complex(begin_x, begin_y), complex(end_x, end_y))
88 model.resolution = old_res
90 def view(socket, client, worker, (name,)):
91 model = lookupModel(socket, client, name)
93 keys = model.cells.keys()
94 keys.sort(key=attrgetter("real", "imag"))
97 cells[k] = model.cells[k]
98 print "size: %i hash: %s" % (len(cells),
99 hashlib.sha256(str(cells)).hexdigest())
101 def data(socket, client, worker, (modelName, cell_r, cell_i, value_r, value_i)):
102 model = lookupModel(socket, client, modelName)
103 cell = complex(float(cell_r), float(cell_i))
104 value = complex(float(value_r), float(value_i))
106 print "received cell " + str(cell) + ": " + str(value)
107 model.cells[complex(cell)] = complex(value)
111 commands = {"help": (help, "help"),
112 "create model": (createModel, "creates a new model"),
113 "delete model": (deleteModel, "deletes a model"),
114 "save model": (saveModel, "makes a persistent copy of the model"),
115 "load model": (loadModel, "loads a persistent model"),
116 "set resolution": (setResolution, "sets the model resolution"),
117 "set range": (setRange, "sets the model range"),
118 "update": (update, "updates the model data"),
119 "view": (view, "shows the model data"),
120 "data": (data, "sends data packets"),
121 "add observer": (addObserver, "adds an observer to a model's events"),}