def render(self, request): logger.log_debug("%s %s" % (request.method, request.path)) logger.log_debug(str(request.args)) try: # get session id sid = request.args.get("session-id", ["0"]) sid = int(sid[0]) if sid == 0 or not sid in self.service.sessions: raise Exception("session-id %i is invalid" % sid) # get revision number rid = request.args.get("revision-number", ["0"]) rid = int(rid[0]) logger.log_debug("UpdateCommand: revision-number is %i" % rid) # if revision-number is not current revision number if not rid == DaapPrivate.REVISION_NUMBER: if rid < 0: raise Exception("invalid revision-number %s" % rid) # return the current revision number mupd = CodeBag("mupd") mupd.add(ContentCode("mstt", 200)) mupd.add(ContentCode("musr", int(DaapPrivate.REVISION_NUMBER))) return Response(200, {"content-type": x_dmap_tagged}, mupd.render()) # create a new update stream to listen for db-changed signal stream = UpdateStream(self.service) return Response(200, {"content-type": x_dmap_tagged}, stream) except Exception, e: logger.log_error("UpdateCommand failed: %s" % e) return Response(400, {"content-type": MimeType("text", "plain")}, str(e))
def _render(self, revision): if revision > 0: logger.log_debug("UpdateStream: new revision is %i" % revision) else: logger.log_debug("UpdateStream: signaling disconnect (revision %i)" % revision) # if _caughtUpdate was not called, then disconnect from the signal if self._signal: db_changed.disconnect(self._signal) self._signal = None # delete the reference to self.deferred self.deferred = None self.length = 0 # remove stream from service.streams del self._service.streams[self] # write response mupd = CodeBag("mupd") mupd.add(ContentCode("mstt", 200)) mupd.add(ContentCode("musr", int(revision))) return str(mupd.render())