2
""" objkeeper - Storage for remoteprotocol
11
_, _, tb = sys.exc_info()
12
GetSetDescriptor = type(type(tb).tb_frame)
14
class RemoteBase(object):
17
from types import FunctionType
19
class ObjKeeper(object):
20
def __init__(self, exported_names = {}):
21
self.exported_objects = [] # list of object that we've exported outside
22
self.exported_names = exported_names # dictionary of visible objects
23
self.exported_types = {} # dict of exported types
24
self.remote_types = {}
25
self.reverse_remote_types = {}
26
self.remote_objects = {}
27
self.exported_types_id = 0 # unique id of exported types
28
self.exported_types_reverse = {} # reverse dict of exported types
30
def register_object(self, obj):
31
# XXX: At some point it makes sense not to export them again and again...
32
self.exported_objects.append(obj)
33
return len(self.exported_objects) - 1
35
def ignore(self, key, value):
36
if key in ('__dict__', '__weakref__', '__class__'):
38
if isinstance(value, GetSetDescriptor):
42
def register_type(self, protocol, tp):
44
return self.exported_types[tp]
46
#print "Registering type %s as %s" % (tp, self.exported_types_id)
47
self.exported_types[tp] = self.exported_types_id
48
self.exported_types_reverse[self.exported_types_id] = tp
49
tp_id = self.exported_types_id
50
self.exported_types_id += 1
52
# XXX: We don't support inheritance here, nor recursive types
54
_dict = dict([(key, protocol.wrap(getattr(tp, key))) for key in dir(tp)
55
if not self.ignore(key, getattr(tp, key))])
56
protocol.send(("type_reg", (tp_id,
60
def fake_remote_type(self, protocol, type_id, _name, _dict):
61
#print "Faking type %s as %s" % (_name, type_id)
62
# create and register new type
63
d = dict([(key, None) for key in _dict])
64
# some stuff needs to go first...
65
if '__doc__' in _dict:
66
d['__doc__'] = protocol.unwrap(_dict['__doc__'])
67
tp = type(_name, (RemoteBase,), d)
68
# Make sure we cannot instantiate the remote type
69
self.remote_types[type_id] = tp
70
self.reverse_remote_types[tp] = type_id
71
for key, value in _dict.items():
73
v = protocol.unwrap(value)
74
if isinstance(v, FunctionType):
75
setattr(tp, key, staticmethod(v))
78
#elif key == '__new__':
83
def get_type(self, id):
84
return self.remote_types[id]
86
def get_object(self, id):
87
return self.exported_objects[id]
89
def register_remote_object(self, controller, id):
90
self.remote_objects[controller] = id
92
def get_remote_object(self, controller):
93
return self.remote_objects[controller]