# HG changeset patch # User Eugen Sawin # Date 1274973296 -7200 # Node ID fb00185487d4bcc594905612a4c0fa344cc8fe80 init diff -r 000000000000 -r fb00185487d4 com.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/com.py Thu May 27 17:14:56 2010 +0200 @@ -0,0 +1,45 @@ +import grid + +def createGrid(socket, client, (name,)): + grid.createGrid(name) + #print "grid %s created" % name + socket.sendto("grid %s created\n" % name, client) + +def listGrids(socket, client): + #print grid.grids + socket.sendto(" ".join(grid.grids.iterkeys()) + "\n", client) + +def lookupGrid(socket, client, name): + if name not in grid.grids: + socket.sendto("grid %s not found\n" % name, client) + return None + else: + return grid.grids[name] + +def listCells(socket, client, (gridName,)): + grid = lookupGrid(socket, client, gridName) + if grid: + socket.sendto(" ".join([str(cell) for cell in grid.cells.itervalues()]) + + "\n", client) + +def setCell(socket, client, (gridName, cellId, value)): + grid = lookupGrid(socket, client, gridName) + if grid: + grid.set(int(cellId), int(value)) + #socket.sendto("cell %s on grid %s set to %s\n" %(cellId, gridName, value), + # client) + +def iterate(socket, client, (gridName, iterNo)): + pass + +def addObserver(socket, client, (gridName,)): + grid = lookupGrid(socket, client, gridName) + if grid: + grid.addObserver(socket, client) + +commands = {"create grid": createGrid, + "list grids": listGrids, + "set cell": setCell, + "list cells": listCells, + "iterate": iterate, + "add observer": addObserver} diff -r 000000000000 -r fb00185487d4 grid.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/grid.py Thu May 27 17:14:56 2010 +0200 @@ -0,0 +1,37 @@ +grids = {} + +def createGrid(name): + grids[name] = Grid(name) + +class Cell(object): + + def __init__(self, id, value): + self.id = id + self.value = value + + def __str__(self): + return "(id:%s value:%s)" % (self.id, self.value) + +class Grid(object): + + def __init__(self, name): + self.name = name + self.cells = {} + self.observers = [] + + def set(self, cellId, value): + if value and cellId not in self.cells: + self.cells[cellId] = Cell(cellId, value) + self.dispatch(Cell(cellId, 0), self.cells[cellId]) + elif not value and cellId in self.cells: + self.dispatch(self.cells[cellId], Cell(cellId, 0)) + del self.cells[cellId] + + def dispatch(self, old, new): + for o in self.observers: + o[0].sendto("old: %s\nnew: %s\n" % (old, new), o[1]) + + def addObserver(self, socket, observer): + self.observers.append((socket, observer)) + + diff -r 000000000000 -r fb00185487d4 server.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server.py Thu May 27 17:14:56 2010 +0200 @@ -0,0 +1,46 @@ +#!/usr/bin/python + +import com +import grid +import optparse +import SocketServer + +option_list = [ + optparse.make_option("-q", "--quiet", action="store_true", dest="quiet", + help="quiet mode", default=False)] + +class Handler(SocketServer.BaseRequestHandler): + """ + """ + def handle(self): + data = self.request[0].strip() + socket = self.request[1] + print "%s wrote:" % self.client_address[0] + print data + for key, value in com.commands.iteritems(): + if key in data: + args = data.partition(key)[2].split() + if args: + value(socket, self.client_address, args) + else: + value(socket, self.client_address) + +class Server(SocketServer.UDPServer): + def __init__(self, host, port, handler, options): + SocketServer.UDPServer.__init__(self, (host, port), handler) + self.host = host + self.port = port + self.handler = handler + self.options = options + def run(self): + self.serve_forever() + +if __name__ == "__main__": + parser = optparse.OptionParser(usage="usage: %prog [options] port", + option_list=option_list) + options, args = parser.parse_args() + + if len(args) > 0: + port = int(args[0]) + server = Server("localhost", port, Handler, options) + server.run()