Index: third_party/twisted_8_1/twisted/protocols/dict.py |
diff --git a/third_party/twisted_8_1/twisted/protocols/dict.py b/third_party/twisted_8_1/twisted/protocols/dict.py |
deleted file mode 100644 |
index 855ab6ace8cf42f0c61c1b78a1625399d8a91540..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/protocols/dict.py |
+++ /dev/null |
@@ -1,362 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-Dict client protocol implementation. |
- |
-@author: U{Pavel Pergamenshchik<mailto:pp64@cornell.edu>} |
-""" |
- |
-from twisted.protocols import basic |
-from twisted.internet import defer, protocol |
-from twisted.python import log |
-from StringIO import StringIO |
- |
-def parseParam(line): |
- """Chew one dqstring or atom from beginning of line and return (param, remaningline)""" |
- if line == '': |
- return (None, '') |
- elif line[0] != '"': # atom |
- mode = 1 |
- else: # dqstring |
- mode = 2 |
- res = "" |
- io = StringIO(line) |
- if mode == 2: # skip the opening quote |
- io.read(1) |
- while 1: |
- a = io.read(1) |
- if a == '"': |
- if mode == 2: |
- io.read(1) # skip the separating space |
- return (res, io.read()) |
- elif a == '\\': |
- a = io.read(1) |
- if a == '': |
- return (None, line) # unexpected end of string |
- elif a == '': |
- if mode == 1: |
- return (res, io.read()) |
- else: |
- return (None, line) # unexpected end of string |
- elif a == ' ': |
- if mode == 1: |
- return (res, io.read()) |
- res += a |
- |
-def makeAtom(line): |
- """Munch a string into an 'atom'""" |
- # FIXME: proper quoting |
- return filter(lambda x: not (x in map(chr, range(33)+[34, 39, 92])), line) |
- |
-def makeWord(s): |
- mustquote = range(33)+[34, 39, 92] |
- result = [] |
- for c in s: |
- if ord(c) in mustquote: |
- result.append("\\") |
- result.append(c) |
- s = "".join(result) |
- return s |
- |
-def parseText(line): |
- if len(line) == 1 and line == '.': |
- return None |
- else: |
- if len(line) > 1 and line[0:2] == '..': |
- line = line[1:] |
- return line |
- |
-class Definition: |
- """A word definition""" |
- def __init__(self, name, db, dbdesc, text): |
- self.name = name |
- self.db = db |
- self.dbdesc = dbdesc |
- self.text = text # list of strings not terminated by newline |
- |
-class DictClient(basic.LineReceiver): |
- """dict (RFC2229) client""" |
- |
- data = None # multiline data |
- MAX_LENGTH = 1024 |
- state = None |
- mode = None |
- result = None |
- factory = None |
- |
- def __init__(self): |
- self.data = None |
- self.result = None |
- |
- def connectionMade(self): |
- self.state = "conn" |
- self.mode = "command" |
- |
- def sendLine(self, line): |
- """Throw up if the line is longer than 1022 characters""" |
- if len(line) > self.MAX_LENGTH - 2: |
- raise ValueError("DictClient tried to send a too long line") |
- basic.LineReceiver.sendLine(self, line) |
- |
- def lineReceived(self, line): |
- try: |
- line = line.decode("UTF-8") |
- except UnicodeError: # garbage received, skip |
- return |
- if self.mode == "text": # we are receiving textual data |
- code = "text" |
- else: |
- if len(line) < 4: |
- log.msg("DictClient got invalid line from server -- %s" % line) |
- self.protocolError("Invalid line from server") |
- self.transport.LoseConnection() |
- return |
- code = int(line[:3]) |
- line = line[4:] |
- method = getattr(self, 'dictCode_%s_%s' % (code, self.state), self.dictCode_default) |
- method(line) |
- |
- def dictCode_default(self, line): |
- """Unkown message""" |
- log.msg("DictClient got unexpected message from server -- %s" % line) |
- self.protocolError("Unexpected server message") |
- self.transport.loseConnection() |
- |
- def dictCode_221_ready(self, line): |
- """We are about to get kicked off, do nothing""" |
- pass |
- |
- def dictCode_220_conn(self, line): |
- """Greeting message""" |
- self.state = "ready" |
- self.dictConnected() |
- |
- def dictCode_530_conn(self): |
- self.protocolError("Access denied") |
- self.transport.loseConnection() |
- |
- def dictCode_420_conn(self): |
- self.protocolError("Server temporarily unavailable") |
- self.transport.loseConnection() |
- |
- def dictCode_421_conn(self): |
- self.protocolError("Server shutting down at operator request") |
- self.transport.loseConnection() |
- |
- def sendDefine(self, database, word): |
- """Send a dict DEFINE command""" |
- assert self.state == "ready", "DictClient.sendDefine called when not in ready state" |
- self.result = None # these two are just in case. In "ready" state, result and data |
- self.data = None # should be None |
- self.state = "define" |
- command = "DEFINE %s %s" % (makeAtom(database.encode("UTF-8")), makeWord(word.encode("UTF-8"))) |
- self.sendLine(command) |
- |
- def sendMatch(self, database, strategy, word): |
- """Send a dict MATCH command""" |
- assert self.state == "ready", "DictClient.sendMatch called when not in ready state" |
- self.result = None |
- self.data = None |
- self.state = "match" |
- command = "MATCH %s %s %s" % (makeAtom(database), makeAtom(strategy), makeAtom(word)) |
- self.sendLine(command.encode("UTF-8")) |
- |
- def dictCode_550_define(self, line): |
- """Invalid database""" |
- self.mode = "ready" |
- self.defineFailed("Invalid database") |
- |
- def dictCode_550_match(self, line): |
- """Invalid database""" |
- self.mode = "ready" |
- self.matchFailed("Invalid database") |
- |
- def dictCode_551_match(self, line): |
- """Invalid strategy""" |
- self.mode = "ready" |
- self.matchFailed("Invalid strategy") |
- |
- def dictCode_552_define(self, line): |
- """No match""" |
- self.mode = "ready" |
- self.defineFailed("No match") |
- |
- def dictCode_552_match(self, line): |
- """No match""" |
- self.mode = "ready" |
- self.matchFailed("No match") |
- |
- def dictCode_150_define(self, line): |
- """n definitions retrieved""" |
- self.result = [] |
- |
- def dictCode_151_define(self, line): |
- """Definition text follows""" |
- self.mode = "text" |
- (word, line) = parseParam(line) |
- (db, line) = parseParam(line) |
- (dbdesc, line) = parseParam(line) |
- if not (word and db and dbdesc): |
- self.protocolError("Invalid server response") |
- self.transport.loseConnection() |
- else: |
- self.result.append(Definition(word, db, dbdesc, [])) |
- self.data = [] |
- |
- def dictCode_152_match(self, line): |
- """n matches found, text follows""" |
- self.mode = "text" |
- self.result = [] |
- self.data = [] |
- |
- def dictCode_text_define(self, line): |
- """A line of definition text received""" |
- res = parseText(line) |
- if res == None: |
- self.mode = "command" |
- self.result[-1].text = self.data |
- self.data = None |
- else: |
- self.data.append(line) |
- |
- def dictCode_text_match(self, line): |
- """One line of match text received""" |
- def l(s): |
- p1, t = parseParam(s) |
- p2, t = parseParam(t) |
- return (p1, p2) |
- res = parseText(line) |
- if res == None: |
- self.mode = "command" |
- self.result = map(l, self.data) |
- self.data = None |
- else: |
- self.data.append(line) |
- |
- def dictCode_250_define(self, line): |
- """ok""" |
- t = self.result |
- self.result = None |
- self.state = "ready" |
- self.defineDone(t) |
- |
- def dictCode_250_match(self, line): |
- """ok""" |
- t = self.result |
- self.result = None |
- self.state = "ready" |
- self.matchDone(t) |
- |
- def protocolError(self, reason): |
- """override to catch unexpected dict protocol conditions""" |
- pass |
- |
- def dictConnected(self): |
- """override to be notified when the server is ready to accept commands""" |
- pass |
- |
- def defineFailed(self, reason): |
- """override to catch reasonable failure responses to DEFINE""" |
- pass |
- |
- def defineDone(self, result): |
- """override to catch succesful DEFINE""" |
- pass |
- |
- def matchFailed(self, reason): |
- """override to catch resonable failure responses to MATCH""" |
- pass |
- |
- def matchDone(self, result): |
- """override to catch succesful MATCH""" |
- pass |
- |
- |
-class InvalidResponse(Exception): |
- pass |
- |
- |
-class DictLookup(DictClient): |
- """Utility class for a single dict transaction. To be used with DictLookupFactory""" |
- |
- def protocolError(self, reason): |
- if not self.factory.done: |
- self.factory.d.errback(InvalidResponse(reason)) |
- self.factory.clientDone() |
- |
- def dictConnected(self): |
- if self.factory.queryType == "define": |
- apply(self.sendDefine, self.factory.param) |
- elif self.factory.queryType == "match": |
- apply(self.sendMatch, self.factory.param) |
- |
- def defineFailed(self, reason): |
- self.factory.d.callback([]) |
- self.factory.clientDone() |
- self.transport.loseConnection() |
- |
- def defineDone(self, result): |
- self.factory.d.callback(result) |
- self.factory.clientDone() |
- self.transport.loseConnection() |
- |
- def matchFailed(self, reason): |
- self.factory.d.callback([]) |
- self.factory.clientDone() |
- self.transport.loseConnection() |
- |
- def matchDone(self, result): |
- self.factory.d.callback(result) |
- self.factory.clientDone() |
- self.transport.loseConnection() |
- |
- |
-class DictLookupFactory(protocol.ClientFactory): |
- """Utility factory for a single dict transaction""" |
- protocol = DictLookup |
- done = None |
- |
- def __init__(self, queryType, param, d): |
- self.queryType = queryType |
- self.param = param |
- self.d = d |
- self.done = 0 |
- |
- def clientDone(self): |
- """Called by client when done.""" |
- self.done = 1 |
- del self.d |
- |
- def clientConnectionFailed(self, connector, error): |
- self.d.errback(error) |
- |
- def clientConnectionLost(self, connector, error): |
- if not self.done: |
- self.d.errback(error) |
- |
- def buildProtocol(self, addr): |
- p = self.protocol() |
- p.factory = self |
- return p |
- |
- |
-def define(host, port, database, word): |
- """Look up a word using a dict server""" |
- d = defer.Deferred() |
- factory = DictLookupFactory("define", (database, word), d) |
- |
- from twisted.internet import reactor |
- reactor.connectTCP(host, port, factory) |
- return d |
- |
-def match(host, port, database, strategy, word): |
- """Match a word using a dict server""" |
- d = defer.Deferred() |
- factory = DictLookupFactory("match", (database, strategy, word), d) |
- |
- from twisted.internet import reactor |
- reactor.connectTCP(host, port, factory) |
- return d |
- |