def __init__(self, vport_name): if self.is_windows: from WinFile import WinFile self._vport = WinFile(vport_name) else: self._vport = os.open(vport_name, os.O_RDWR) self._buffer = ''
def __init__(self, vport_name): if self.is_test: from test_port import get_test_port self._vport = get_test_port(vport_name) self._read = self._vport.read self._write = self._vport.write elif self.is_windows: from WinFile import WinFile self._vport = WinFile(vport_name) self._read = self._vport.read self._write = self._vport.write else: self._vport = os.open(vport_name, os.O_RDWR) self._read = self._os_read self._write = self._os_write
def __init__(self, vport_prefix): if self.is_test: from test_port import get_test_port self._vport = get_test_port(vport_prefix) self._read = self._vport.read self._write = self._vport.write elif self.is_windows: from WinFile import WinFile self._vport = WinFile(get_vports(vport_prefix)) self._read = self._vport.read self._write = self._vport.write else: current_port, legacy_port = get_vports(vport_prefix) vport_name = current_port if os.path.exists(legacy_port): vport_name = legacy_port self._vport = os.open(vport_name, os.O_RDWR) self._read = self._os_read self._write = self._os_write
class VirtIoChannel: # Python on Windows 7 return 'Microsoft' rather than 'Windows' as documented. is_windows = (platform.system() == 'Windows') or (platform.system() == 'Microsoft') def __init__(self, vport_name): if self.is_windows: from WinFile import WinFile self._vport = WinFile(vport_name) else: self._vport = os.open(vport_name, os.O_RDWR) self._buffer = '' def _readbuffer(self): if self.is_windows: buffer = self._vport.read(4096) else: buffer = os.read(self._vport, 4096) if buffer: self._buffer += buffer else: # read() returns immediately (non-blocking) if no one is # listening on the other side of the virtio-serial port. # So in order not to be in a tight-loop and waste CPU # time, we just sleep for a while and hope someone will # be there when we will awake from our nap. time.sleep(1) def _readline(self): newline = self._buffer.find('\n') while newline < 0: self._readbuffer() newline = self._buffer.find('\n') if newline >= 0: line, self._buffer = self._buffer.split('\n', 1) else: line = None return line def _parseLine(self, line): try: args = json.loads(line.decode('utf8')) name = args['__name__'] del args['__name__'] except: name = None args = None return (name, args) def read(self): return self._parseLine(self._readline()) def write(self, name, args = {}): if not isinstance(name, str): raise TypeError("1nd arg must be a str.") if not isinstance(args, dict): raise TypeError("2nd arg must be a dict.") args['__name__'] = name message = (json.dumps(args) + '\n').encode('utf8') while len(message) > 0: if self.is_windows: written = self._vport.write(message) else: written = os.write(self._vport, message) message = message[written:]
class VirtIoChannel: # Python on Windows 7 return 'Microsoft' rather than 'Windows' as documented. is_windows = (platform.system() == 'Windows') or (platform.system() == 'Microsoft') def __init__(self, vport_name): if self.is_windows: from WinFile import WinFile self._vport = WinFile(vport_name) else: self._vport = os.open(vport_name, os.O_RDWR) self._buffer = '' def _readbuffer(self): if self.is_windows: buffer = self._vport.read(4096) else: buffer = os.read(self._vport, 4096) if buffer: self._buffer += buffer else: # read() returns immediately (non-blocking) if no one is # listening on the other side of the virtio-serial port. # So in order not to be in a tight-loop and waste CPU # time, we just sleep for a while and hope someone will # be there when we will awake from our nap. time.sleep(1) def _readline(self): newline = self._buffer.find('\n') while newline < 0: self._readbuffer() newline = self._buffer.find('\n') if newline >= 0: line, self._buffer = self._buffer.split('\n', 1) else: line = None return line def _parseLine(self, line): try: args = json.loads(line.decode('utf8')) name = args['__name__'] del args['__name__'] except: name = None args = None return (name, args) def read(self): return self._parseLine(self._readline()) def write(self, name, args={}): if not isinstance(name, str): raise TypeError("1nd arg must be a str.") if not isinstance(args, dict): raise TypeError("2nd arg must be a dict.") args['__name__'] = name message = (json.dumps(args) + '\n').encode('utf8') while len(message) > 0: if self.is_windows: written = self._vport.write(message) else: written = os.write(self._vport, message) message = message[written:]