def create_local_station(self, props, identification, name): self.station = self.station_mgr.create(props.local_address, self.rvcid) self.station.is_connected = True local_station_url = self.backend.local_station.copy() local_station_url["natm"] = props.nat_mapping local_station_url["natf"] = props.nat_filtering local_station_url["port"] = props.local_address[1] public_station_url = self.backend.public_station.copy() public_station_url["natm"] = props.nat_mapping public_station_url["natf"] = props.nat_filtering public_station_url["port"] = props.public_address[1] self.secure_client.replace_url(self.backend.local_station, local_station_url) self.backend.local_station = local_station_url self.backend.public_station = public_station_url local_location = StationLocation.from_station_url(local_station_url) public_location = StationLocation.from_station_url(public_station_url) self.station.connection_info = StationConnectionInfo( public_location, local_location) self.station.identification_info = IdentificationInfo( identification, name)
def send_join_response(self, station, assigned_index, host_index, stations): logger.info("Sending join response") infosize = (StationConnectionInfo.sizeof() + 4) & ~3 limit = self.transport.size_limit() - 0xC per_packet = limit // infosize fragments = (len(stations) + per_packet - 1) // per_packet for i in range(fragments): offset = i * per_packet remaining = len(stations) - offset num_infos = min(remaining, per_packet) data = bytes([ self.MESSAGE_JOIN_RESPONSE, len(stations), host_index, assigned_index, fragments, i, num_infos, offset ]) for j in range(num_infos): station_info = stations[offset + j] data += station_info.connection_info.serialize() data += bytes([station_info.index, 0]) self.send(station, data, 0, True)
def connect_to_host(self, host_urls): public_url = None local_url = None for url in host_urls: if url.is_public(): public_url = url else: local_url = url if not public_url or not local_url: raise ValueError("Incomplete station url list") public_location = StationLocation.from_station_url(public_url) local_location = StationLocation.from_station_url(local_url) conn_info = StationConnectionInfo(public_location, local_location) self.connection_mgr.connect(conn_info) return self.station_mgr.find_by_rvcid(public_url["RVCID"])
def sizeof(): return StationConnectionInfo.sizeof() + 2
def deserialize(cls, data): conn_info = StationConnectionInfo.deserialize(data) index = data[conn_info.sizeof()] return cls(conn_info, index)