screenshotr.pxi 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. cdef extern from "libimobiledevice/screenshotr.h":
  2. cdef struct screenshotr_client_private:
  3. pass
  4. ctypedef screenshotr_client_private *screenshotr_client_t
  5. ctypedef enum screenshotr_error_t:
  6. SCREENSHOTR_E_SUCCESS = 0
  7. SCREENSHOTR_E_INVALID_ARG = -1
  8. SCREENSHOTR_E_PLIST_ERROR = -2
  9. SCREENSHOTR_E_MUX_ERROR = -3
  10. SCREENSHOTR_E_BAD_VERSION = -4
  11. SCREENSHOTR_E_UNKNOWN_ERROR = -256
  12. screenshotr_error_t screenshotr_client_new(idevice_t device, lockdownd_service_descriptor_t descriptor, screenshotr_client_t * client)
  13. screenshotr_error_t screenshotr_client_free(screenshotr_client_t client)
  14. screenshotr_error_t screenshotr_take_screenshot(screenshotr_client_t client, char **imgdata, uint64_t *imgsize)
  15. cdef class ScreenshotrError(BaseError):
  16. def __init__(self, *args, **kwargs):
  17. self._lookup_table = {
  18. SCREENSHOTR_E_SUCCESS: "Success",
  19. SCREENSHOTR_E_INVALID_ARG: "Invalid argument",
  20. SCREENSHOTR_E_PLIST_ERROR: "Property list error",
  21. SCREENSHOTR_E_MUX_ERROR: "MUX error",
  22. SCREENSHOTR_E_BAD_VERSION: "Bad version",
  23. SCREENSHOTR_E_UNKNOWN_ERROR: "Unknown error"
  24. }
  25. BaseError.__init__(self, *args, **kwargs)
  26. cdef class ScreenshotrClient(DeviceLinkService):
  27. __service_name__ = "com.apple.mobile.screenshotr"
  28. cdef screenshotr_client_t _c_client
  29. def __cinit__(self, iDevice device not None, LockdownServiceDescriptor descriptor, *args, **kwargs):
  30. self.handle_error(screenshotr_client_new(device._c_dev, descriptor._c_service_descriptor, &self._c_client))
  31. def __dealloc__(self):
  32. cdef screenshotr_error_t err
  33. if self._c_client is not NULL:
  34. err = screenshotr_client_free(self._c_client)
  35. self.handle_error(err)
  36. cpdef bytes take_screenshot(self):
  37. cdef:
  38. char* c_data = NULL
  39. uint64_t data_size
  40. bytes result
  41. screenshotr_error_t err
  42. err = screenshotr_take_screenshot(self._c_client, &c_data, &data_size)
  43. try:
  44. self.handle_error(err)
  45. result = c_data[:data_size]
  46. return result
  47. except Exception, e:
  48. if c_data != NULL:
  49. free(c_data)
  50. raise
  51. cdef inline BaseError _error(self, int16_t ret):
  52. return ScreenshotrError(ret)