file_relay.pxi 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. cdef extern from "libimobiledevice/file_relay.h":
  2. cdef struct file_relay_client_private:
  3. pass
  4. ctypedef file_relay_client_private *file_relay_client_t
  5. ctypedef char** const_sources_t "const char**"
  6. ctypedef enum file_relay_error_t:
  7. FILE_RELAY_E_SUCCESS = 0
  8. FILE_RELAY_E_INVALID_ARG = -1
  9. FILE_RELAY_E_PLIST_ERROR = -2
  10. FILE_RELAY_E_MUX_ERROR = -3
  11. FILE_RELAY_E_INVALID_SOURCE = -4
  12. FILE_RELAY_E_STAGING_EMPTY = -5
  13. FILE_RELAY_E_PERMISSION_DENIED = -6
  14. FILE_RELAY_E_UNKNOWN_ERROR = -256
  15. file_relay_error_t file_relay_client_new(idevice_t device, lockdownd_service_descriptor_t descriptor, file_relay_client_t *client)
  16. file_relay_error_t file_relay_client_free(file_relay_client_t client)
  17. file_relay_error_t file_relay_request_sources(file_relay_client_t client, const_sources_t sources, idevice_connection_t *connection)
  18. cdef class FileRelayError(BaseError):
  19. def __init__(self, *args, **kwargs):
  20. self._lookup_table = {
  21. FILE_RELAY_E_SUCCESS: "Success",
  22. FILE_RELAY_E_INVALID_ARG: "Invalid argument",
  23. FILE_RELAY_E_PLIST_ERROR: "Property list error",
  24. FILE_RELAY_E_MUX_ERROR: "MUX error",
  25. FILE_RELAY_E_INVALID_SOURCE: "Invalid source",
  26. FILE_RELAY_E_STAGING_EMPTY: "Staging empty",
  27. FILE_RELAY_E_PERMISSION_DENIED: "Permission denied",
  28. FILE_RELAY_E_UNKNOWN_ERROR: "Unknown error"
  29. }
  30. BaseError.__init__(self, *args, **kwargs)
  31. from libc.stdlib cimport *
  32. cdef class FileRelayClient(PropertyListService):
  33. __service_name__ = "com.apple.mobile.file_relay"
  34. cdef file_relay_client_t _c_client
  35. def __cinit__(self, iDevice device not None, LockdownServiceDescriptor descriptor, *args, **kwargs):
  36. self.handle_error(file_relay_client_new(device._c_dev, descriptor._c_service_descriptor, &self._c_client))
  37. def __dealloc__(self):
  38. cdef file_relay_error_t err
  39. if self._c_client is not NULL:
  40. err = file_relay_client_free(self._c_client)
  41. self.handle_error(err)
  42. cpdef iDeviceConnection request_sources(self, list sources):
  43. cdef:
  44. file_relay_error_t err
  45. Py_ssize_t count = len(sources)
  46. char** c_sources = <char**>malloc(sizeof(char*) * (count + 1))
  47. iDeviceConnection conn = iDeviceConnection.__new__(iDeviceConnection)
  48. for i, value in enumerate(sources):
  49. c_sources[i] = value
  50. c_sources[count] = NULL
  51. err = file_relay_request_sources(self._c_client, <const_sources_t>c_sources, &conn._c_connection)
  52. free(c_sources)
  53. self.handle_error(err)
  54. return conn
  55. cdef inline BaseError _error(self, int16_t ret):
  56. return FileRelayError(ret)