mobile_image_mounter.pxi 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. cdef extern from "libimobiledevice/mobile_image_mounter.h":
  2. cdef struct mobile_image_mounter_client_private:
  3. pass
  4. ctypedef mobile_image_mounter_client_private *mobile_image_mounter_client_t
  5. ctypedef enum mobile_image_mounter_error_t:
  6. MOBILE_IMAGE_MOUNTER_E_SUCCESS = 0
  7. MOBILE_IMAGE_MOUNTER_E_INVALID_ARG = -1
  8. MOBILE_IMAGE_MOUNTER_E_PLIST_ERROR = -2
  9. MOBILE_IMAGE_MOUNTER_E_CONN_FAILED = -3
  10. MOBILE_IMAGE_MOUNTER_E_UNKNOWN_ERROR = -256
  11. mobile_image_mounter_error_t mobile_image_mounter_new(idevice_t device, lockdownd_service_descriptor_t descriptor, mobile_image_mounter_client_t *client)
  12. mobile_image_mounter_error_t mobile_image_mounter_free(mobile_image_mounter_client_t client)
  13. mobile_image_mounter_error_t mobile_image_mounter_lookup_image(mobile_image_mounter_client_t client, char *image_type, plist.plist_t *result)
  14. mobile_image_mounter_error_t mobile_image_mounter_mount_image(mobile_image_mounter_client_t client, char *image_path, char *image_signature, uint16_t signature_length, char *image_type, plist.plist_t *result)
  15. mobile_image_mounter_error_t mobile_image_mounter_hangup(mobile_image_mounter_client_t client)
  16. cdef class MobileImageMounterError(BaseError):
  17. def __init__(self, *args, **kwargs):
  18. self._lookup_table = {
  19. MOBILE_IMAGE_MOUNTER_E_SUCCESS: "Success",
  20. MOBILE_IMAGE_MOUNTER_E_INVALID_ARG: "Invalid argument",
  21. MOBILE_IMAGE_MOUNTER_E_PLIST_ERROR: "Property list error",
  22. MOBILE_IMAGE_MOUNTER_E_CONN_FAILED: "Connection failed",
  23. MOBILE_IMAGE_MOUNTER_E_UNKNOWN_ERROR: "Unknown error"
  24. }
  25. BaseError.__init__(self, *args, **kwargs)
  26. cdef class MobileImageMounterClient(PropertyListService):
  27. __service_name__ = "com.apple.mobile.mobile_image_mounter"
  28. cdef mobile_image_mounter_client_t _c_client
  29. def __cinit__(self, iDevice device not None, LockdownServiceDescriptor descriptor, *args, **kwargs):
  30. self.handle_error(mobile_image_mounter_new(device._c_dev, descriptor._c_service_descriptor, &self._c_client))
  31. def __dealloc__(self):
  32. cdef mobile_image_mounter_error_t err
  33. if self._c_client is not NULL:
  34. err = mobile_image_mounter_free(self._c_client)
  35. self.handle_error(err)
  36. cdef inline BaseError _error(self, int16_t ret):
  37. return MobileImageMounterError(ret)
  38. cpdef plist.Node lookup_image(self, bytes image_type):
  39. cdef:
  40. plist.plist_t c_node = NULL
  41. mobile_image_mounter_error_t err
  42. err = mobile_image_mounter_lookup_image(self._c_client, image_type, &c_node)
  43. try:
  44. self.handle_error(err)
  45. return plist.plist_t_to_node(c_node)
  46. except Exception, e:
  47. if c_node != NULL:
  48. plist.plist_free(c_node)
  49. cpdef plist.Node mount_image(self, bytes image_path, bytes image_signature, bytes image_type):
  50. cdef:
  51. plist.plist_t c_node = NULL
  52. mobile_image_mounter_error_t err
  53. err = mobile_image_mounter_mount_image(self._c_client, image_path, image_signature, len(image_signature),
  54. image_type, &c_node)
  55. try:
  56. self.handle_error(err)
  57. return plist.plist_t_to_node(c_node)
  58. except Exception, e:
  59. if c_node != NULL:
  60. plist.plist_free(c_node)
  61. cpdef hangup(self):
  62. cdef mobile_image_mounter_error_t err
  63. err = mobile_image_mounter_hangup(self._c_client)
  64. self.handle_error(err)