#! /usr/bin/python
from twisted.python.components import Interface
# delimiter characters.
LIST = chr(0x80) # old
INT = chr(0x81)
STRING = chr(0x82)
NEG = chr(0x83)
FLOAT = chr(0x84)
# "optional" -- these might be refused by a low-level implementation.
LONGINT = chr(0x85) # old
LONGNEG = chr(0x86) # old
# really optional; this is is part of the 'pb' vocabulary
VOCAB = chr(0x87)
# newbanana tokens
OPEN = chr(0x88)
CLOSE = chr(0x89)
ABORT = chr(0x8A)
tokenNames = {
LIST: "LIST",
INT: "INT",
STRING: "STRING",
NEG: "NEG",
FLOAT: "FLOAT",
LONGINT: "LONGINT",
LONGNEG: "LONGNEG",
VOCAB: "VOCAB",
OPEN: "OPEN",
CLOSE: "CLOSE",
ABORT: "ABORT",
}
SIZE_LIMIT = 1000 # default limit on the body length of long tokens (STRING,
# LONGINT, LONGNEG)
class Violation(Exception):
pass
class BananaError(Exception):
"""This exception is raised in response to a fundamental protocol
violation. The connection should be dropped immediately.
.why is a string that describes what kind of violation occurred
.where is an optional string that describes the node of the object graph
where the failure was noticed.
"""
def __init__(self, why, where="?"):
self.why = why
self.where = where
def __str__(self):
return "BananaError(in %s): %s" % (self.where, self.why)
class BananaError2(BananaError):
"""This exception is raised when something else goes wrong during the
unserialization process. This catches arbitrary exceptions in Unslicer
methods.
This exists solely to add the .where attribute to the raised exception.
"""
def __str__(self):
return "BananaError2(in %s): %s" % (self.where, self.why)
class IReferenceable(Interface):
# TODO: really?
"""This object is remotely referenceable. This means it defines some
remote_* methods and may have a schema which describes how those methods
may be invoked.
"""
syntax highlighted by Code2HTML, v. 0.9.1