def screencap(self):
     t0 = time.perf_counter()
     if self.compress == 0:
         s = self.device_session_factory().exec_stream(self.command)
         header = recvexactly(s, 12)
         w, h, f = struct.unpack_from('III', header, 0)
         datalen = w * h * 4
         data = recvall(s, datalen + 4, True)
         s.close()
         # data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608)
         assert (f == 1)
         result = _screencap_to_image((w, h, data[:datalen + 4]),
                                      self.screenshot_rotate)
     else:
         s = self.device_session_factory().exec_stream(self.command +
                                                       self.compress_suffix)
         data = recvall(s, 8388608, True)
         data = self.decompress(data)
         w, h, f = struct.unpack_from('III', data, 0)
         datalen = w * h * 4
         s.close()
         # data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608)
         assert (f == 1)
         result = _screencap_to_image((w, h, data[12:datalen + 12 + 4]),
                                      self.screenshot_rotate)
     t = time.perf_counter() - t0
     logger.debug('screencap: %.3fms', t * 1000)
     return result
Beispiel #2
0
 def screencap(self):
     s = self.device_session_factory().exec_stream('screencap -p')
     data = recvall(s, 4194304, True)
     img = Image.open(BytesIO(data))
     if self.screenshot_rotate != 0:
         img = img.rotate(self.screenshot_rotate)
     return img
Beispiel #3
0
 def screencap(self):
     s = self.device_session_factory().exec_stream('screencap|gzip -1')
     data = recvall(s, 4194304)
     s.close()
     data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608)
     w, h, f = struct.unpack_from('III', data, 0)
     assert (f == 1)
     return _screencap_to_image((w, h, data[12:]), self.screenshot_rotate)
Beispiel #4
0
 def exec(self, cmd):
     """run command in device, returns stdout content after the command exits"""
     if len(cmd) == 0:
         raise ValueError('no command specified for blocking exec')
     sock = self.exec_stream(cmd)
     data = recvall(sock)
     sock.close()
     return data
Beispiel #5
0
 def shell(self, cmd):
     """run command in device, returns pty output after the command exits"""
     if len(cmd) == 0:
         raise ValueError('no command specified for blocking shell')
     sock = self.shell_stream(cmd)
     data = recvall(sock)
     sock.close()
     return data
 def screencap(self):
     """returns (width, height, pixels)
     pixels in RGBA/RGBX format"""
     s = self.device_session_factory().exec_stream('screencap|gzip -1')
     data = recvall(s, 4194304)
     s.close()
     data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608)
     w, h, f = struct.unpack_from('III', data, 0)
     assert (f == 1)
     return (w, h, data[12:])
Beispiel #7
0
 def screencap(self):
     future = self.rch.register_cookie()
     with future:
         control_sock = self.device_session_factory().exec_stream(
             '(echo -n %s; screencap) | nc %s %d' %
             (future.cookie.decode(), self.loopback, self.rch.port))
         with control_sock, future.get() as conn:
             data = recvall(conn, 8388608, True)
     w, h, f = struct.unpack_from('III', data, 0)
     assert (f == 1)
     return _screencap_to_image((w, h, data[12:]), self.screenshot_rotate)
 def _reverse_connection_screencap(self):
     """returns (width, height, pixels)
     pixels in RGBA/RGBX format"""
     future = self.rch.register_cookie()
     with future:
         control_sock = self.device_session_factory().exec_stream(
             '(echo -n %s; screencap) | nc %s %d' %
             (future.cookie.decode(), self.loopback, self.rch.port))
         with control_sock:
             with future.get() as conn:
                 data = recvall(conn, 8388608, True)
     w, h, f = struct.unpack_from('III', data, 0)
     assert (f == 1)
     return (w, h, data[12:].tobytes())
 def screencap(self):
     from PIL import Image as PILImage, ImageCms
     s = self.device_session_factory().exec_stream(self.command)
     data = recvall(s, 4194304, True)
     img = PILImage.open(BytesIO(data))
     if self.screenshot_rotate != 0:
         img = img.rotate(self.screenshot_rotate)
     if icc := img.info.get('icc_profile', ''):
         iccio = BytesIO(icc)
         src_profile = ImageCms.ImageCmsProfile(iccio)
         from imgreco.cms import srgb_profile
         ImageCms.profileToProfile(img,
                                   src_profile,
                                   srgb_profile,
                                   ImageCms.INTENT_RELATIVE_COLORIMETRIC,
                                   inPlace=True)
Beispiel #10
0
 def _test_reverse_connection(self, loopbacks):
     for addr in loopbacks:
         logger.debug('testing loopback address %s', addr)
         future = self.rch.register_cookie()
         with future:
             cmd = 'echo -n %sOKAY | nc -w 1 %s %d' % (
                 future.cookie.decode(), addr, self.rch.port)
             logger.debug(cmd)
             control_sock = self.device_session_factory().exec_stream(cmd)
             with control_sock:
                 conn = future.get(2)
                 if conn is not None:
                     data = recvall(conn)
                     conn.close()
                     if data == b'OKAY':
                         self.loopback = addr
                         logger.debug('found loopback address %s', addr)
                         return True
     return False
 def screencap_png(self):
     """returns PNG bytes"""
     s = self.device_session_factory().exec_stream('screencap -p')
     data = recvall(s, 4194304)
     return data