def run(self): while True: # import rpdb2; rpdb2.start_embedded_debugger("foo") try: size = int(self.stdin.readline().strip()) message = self.stdin.read(size) type, rest = message.split(" ", 1) if type == "SERVE": try: type, data = self.tk.serve(rest) result = {'type':type, 'data':data.encode('base64')} except KeyError, e: result = {} elif type == "HANDLE": # print rest method, args_str = rest.split(" ", 1) ## make sure we're not passing unicode keys as keyword ## arguments args = un_unicode(simplejson.loads(args_str)) result = self.tk.handle(method, **args) else: ## wtf? pass message = simplejson.dumps(result)
def handle(self, method, **args): if method == "start": if len(self._controls) > 1: # app is already running, resume session by restoring UI ## restore is a recursive process, start with the root ## and toplevels self._root.restore() ## iterate over toplevels #for id, c in self._controls.items(): # c.restore() else: self.app.run(self) return dict(state="started", config=dict(debug=self.debug, polling=self.polling, title=self.title) ) if method == "task" and 'queue' in args: queue = json.loads(args['queue']) for task in queue: tasktype = task['method'] id = int(task['id']) if tasktype == "event": eventtype = task.get('type') if eventtype == "timer": self.timers.fire(id) else: control = self._controls[id] ## A disabled control shouldn't receive events if not control.enabled: continue dispatcher(eventtype, control, **un_unicode(task.get('data', {}))) elif tasktype == "sync": control = self._controls[id] control.sync(**un_unicode(task.get('data', {}))) ## any other case, including "pop" which is not handled explicitly ## right now. if self._queue: tasks = [x.task() for x in self._queue] self._queue = [] return tasks return []