Source code for remcall.communication.bridge
from ..codec import SchemaReader
from ..codec import SchemaWriter
from .receive import Receiver
from .send import Sender
from .store import ReferenceStore
from .proxy import ProxyFactory
from ..implementation import EnumRecordImplementation
from ..schema import Type
from threading import Thread
from ..naming import PythonNameConverter
[docs]class Bridge:
def __init__(self, schema, instream, outstream, main, enum_record_implementation: EnumRecordImplementation):
enum_record_implementation = enum_record_implementation or EnumRecordImplementation(schema, PythonNameConverter())
self.receiver = Receiver(schema, instream, None, self.return_method, self.acknowledge_disconnect, enum_record_implementation.name_converter)
self.sender = Sender(schema, outstream, None)
self.proxy_factory = ProxyFactory(schema, self, enum_record_implementation.name_converter)
self.main = main
self.is_client = main is None
self.store = ReferenceStore(self.is_client, self.proxy_factory)
self.receiver.get_object = self.store.get_object
self.receiver.get_enum_implementation = enum_record_implementation
self.sender.get_id_for_object = self.store.get_id_for_object
main_id = self.sender.get_id_for_object(self.main)
if self.is_client:
assert main_id == 0, 'ID of main object is {} but should be 0 on client as it is None'.format(main_id)
else:
assert main_id == 1, 'ID of main object is {} but should be 1 on server'.format(main_id)
if self.is_client:
self.server = self.receiver.get_object(1, schema.main_type)
self.mainloop = self.receiver.mainloop
self.mainloop_thread = Thread(target=self.mainloop)
def __enter__(self):
self.mainloop_thread.start()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.disconnect()
[docs] def call_method(self, method, this, args_dict):
request_id = self.sender.call_method(method, this, args_dict)
return self.receiver.wait_for_method_return(request_id, method.return_type)
[docs] def return_method(self, request_id: int, return_type: Type, return_value):
self.sender.return_method(request_id, return_type, return_value)
[docs] def disconnect(self):
self.sender.disconnect()
[docs] def acknowledge_disconnect(self):
self.sender.acknowledge_disconnect()