com.py
author Eugen Sawin <sawine@me73.com>
Thu, 17 Jun 2010 23:24:41 +0200
changeset 6 9147c845cecb
parent 5 5ab3cc2e7851
permissions -rw-r--r--
Client skeleton added.
     1 import model
     2 import pickle
     3 import hashlib
     4 from operator import attrgetter
     5 
     6 commands = {}
     7 
     8 def help(socket, client, worker):
     9 	socket.sendto("\n".join([key + ": " + value[1] 
    10 		for key, value in commands.iteritems()]) + "\n", client)
    11 
    12 def createModel(socket, client, worker, (name,)):
    13 	model.createModel(name)
    14 	socket.sendto("model %s created\n" % name, client)
    15 	
    16 def deleteModel(socket, client, worker, (name,)):
    17 	if model.deleteModel(name):
    18 		socket.sendto("model %s deleted\n" % name, client)
    19 		
    20 def saveModel(socket, client, worker, (name,)):
    21 	model = lookupModel(socket, client, name)
    22 	if model:
    23 		pickle.dump(model, open(name + ".model", "w"))
    24 		socket.sendto("model %s saved\n" % name, client)
    25 		
    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)		
    29 
    30 def getModel(name):
    31 	if name in model.models:
    32 		return model.models[name]
    33 	
    34 def lookupModel(socket, client, name):
    35 	if name not in model.models:
    36 		socket.sendto("model %s not found\n" % name, client)
    37 		return None
    38 	else:
    39 		return model.models[name]
    40 		
    41 def addObserver(socket, client, worker, (modelName, eventType)):
    42 	model = lookupModel(socket, client, modelName)
    43 	if model:
    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"
    48 		
    49 def setResolution(socket, client, worker, (modelName, x, y)):
    50 	model = lookupModel(socket, client, modelName)
    51 	if model:
    52 		model.setResolution(int(x), int(y))
    53 		socket.sendto("model %s resolution set to %s, %s\n" % 
    54 			(modelName, x, y), client)
    55 			
    56 def setRange(socket, client, worker, (modelName, begin, end)):
    57 	model = lookupModel(socket, client, modelName)
    58 	if model:
    59 		model.setRange(complex(begin), complex(end))
    60 		socket.sendto("model %s range set to %s, %s\n" % 
    61 			(modelName, begin, end), client)
    62 
    63 def update(socket, client, worker, (modelName, iterations)):
    64 	model = lookupModel(socket, client, modelName)
    65 	if model:
    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])
    73 
    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))
    79 			print model.range
    80 			print model.resolution
    81 			model.cells = {}
    82 			dump = pickle.dumps(model)
    83 			socket.sendto("%010i%s%010i" % (len(dump), dump, 
    84 				int(iterations)), w) 
    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
    89 
    90 def view(socket, client, worker, (name,)):
    91 	model = lookupModel(socket, client, name)
    92 	if model:
    93 		keys = model.cells.keys()
    94 		keys.sort(key=attrgetter("real", "imag"))
    95 		cells = {}
    96 		for k in keys:
    97 			cells[k] = model.cells[k]
    98 		print "size: %i hash: %s" % (len(cells), 
    99 				hashlib.sha256(str(cells)).hexdigest())
   100 
   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))
   105 	if model:
   106 		print "received cell " + str(cell) + ": " + str(value)		
   107 		model.cells[complex(cell)] = complex(value)
   108 	else:
   109 		return (cell, value)
   110 	
   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"),}