diff --git a/Shared/Routing.py b/Shared/Routing.py index a22b37d..8651ad7 100644 --- a/Shared/Routing.py +++ b/Shared/Routing.py @@ -1,14 +1,24 @@ -import Logging +import ESock BROADCAST = 0 ROUTE = 1 SOCK = 2 + class InvalidRouteSetup(AttributeError): def __init__(self, msg): super(AttributeError, self).__init__(msg) + +class InvalidRouteLength(AttributeError): + def __init__(self, msg): + super(AttributeError, self).__init__(msg) + + class ServerRoute: + REQUIRED = [] + PATCHED = False + def __init__(self, **kwargs): pass @@ -18,27 +28,29 @@ class ServerRoute: def start(self, handler): pass - def stop(self, handler): - pass - class ClientRoute: def run(self, data, handler): pass + def create_routes(routes, handler): routes = routes.copy() reverse_routes = {} for prefix in routes: + if len(prefix) > ESock.MAX_ROUTE_LENGTH: + raise InvalidRouteLength("'%s' is too long (maximum: %d)" % (prefix, ESock.MAX_ROUTE_LENGTH)) if type(routes[prefix]) is tuple or type(routes[prefix]) is list: routes[prefix] = routes[prefix][0](**routes[prefix][1]) reverse_routes[routes[prefix]] = prefix for prefix in routes: attrs = dir(routes[prefix]) - if "REQUIRED" in attrs: - for required in type(routes[prefix]).REQUIRED: + if not routes[prefix].PATCHED: + for required in routes[prefix].REQUIRED: if required == BROADCAST: routes[prefix].broadcast = handler.broadcast elif required == ROUTE: routes[prefix].route = reverse_routes[routes[prefix]] + routes[prefix].PATCHED = True + routes[prefix].start(handler) return routes \ No newline at end of file