diagnostics_relay.pxi 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. REQUEST_TYPE_ALL = "All"
  2. REQUEST_TYPE_WIFI = "WiFi"
  3. REQUEST_TYPE_GAS_GAUGE = "GasGauge"
  4. REQUEST_TYPE_NAND = "NAND"
  5. cdef extern from "libimobiledevice/diagnostics_relay.h":
  6. cdef struct diagnostics_relay_client_private:
  7. pass
  8. ctypedef diagnostics_relay_client_private *diagnostics_relay_client_t
  9. ctypedef enum diagnostics_relay_error_t:
  10. DIAGNOSTICS_RELAY_E_SUCCESS = 0
  11. DIAGNOSTICS_RELAY_E_INVALID_ARG = -1
  12. DIAGNOSTICS_RELAY_E_PLIST_ERROR = -2
  13. DIAGNOSTICS_RELAY_E_MUX_ERROR = -3
  14. DIAGNOSTICS_RELAY_E_UNKNOWN_REQUEST = -4
  15. DIAGNOSTICS_RELAY_E_UNKNOWN_ERROR = -256
  16. cdef enum:
  17. DIAGNOSTICS_RELAY_ACTION_FLAG_WAIT_FOR_DISCONNECT = (1 << 1)
  18. DIAGNOSTICS_RELAY_ACTION_FLAG_DISPLAY_PASS = (1 << 2)
  19. DIAGNOSTICS_RELAY_ACTION_FLAG_DISPLAY_FAIL = (1 << 3)
  20. diagnostics_relay_error_t diagnostics_relay_client_new(idevice_t device, lockdownd_service_descriptor_t descriptor, diagnostics_relay_client_t * client)
  21. diagnostics_relay_error_t diagnostics_relay_client_free(diagnostics_relay_client_t client)
  22. diagnostics_relay_error_t diagnostics_relay_goodbye(diagnostics_relay_client_t client)
  23. diagnostics_relay_error_t diagnostics_relay_sleep(diagnostics_relay_client_t client)
  24. diagnostics_relay_error_t diagnostics_relay_restart(diagnostics_relay_client_t client, int flags)
  25. diagnostics_relay_error_t diagnostics_relay_shutdown(diagnostics_relay_client_t client, int flags)
  26. diagnostics_relay_error_t diagnostics_relay_request_diagnostics(diagnostics_relay_client_t client, char* type, plist.plist_t* diagnostics)
  27. diagnostics_relay_error_t diagnostics_relay_query_mobilegestalt(diagnostics_relay_client_t client, plist.plist_t keys, plist.plist_t* result)
  28. diagnostics_relay_error_t diagnostics_relay_query_ioregistry_entry(diagnostics_relay_client_t client, char* name, char* class_name, plist.plist_t* result)
  29. diagnostics_relay_error_t diagnostics_relay_query_ioregistry_plane(diagnostics_relay_client_t client, char* plane, plist.plist_t* result)
  30. cdef class DiagnosticsRelayError(BaseError):
  31. def __init__(self, *args, **kwargs):
  32. self._lookup_table = {
  33. DIAGNOSTICS_RELAY_E_SUCCESS: "Success",
  34. DIAGNOSTICS_RELAY_E_INVALID_ARG: "Invalid argument",
  35. DIAGNOSTICS_RELAY_E_PLIST_ERROR: "Property list error",
  36. DIAGNOSTICS_RELAY_E_MUX_ERROR: "MUX error",
  37. DIAGNOSTICS_RELAY_E_UNKNOWN_REQUEST: "Unknown request",
  38. DIAGNOSTICS_RELAY_E_UNKNOWN_ERROR: "Unknown error"
  39. }
  40. BaseError.__init__(self, *args, **kwargs)
  41. cdef class DiagnosticsRelayClient(PropertyListService):
  42. __service_name__ = "com.apple.mobile.diagnostics_relay"
  43. cdef diagnostics_relay_client_t _c_client
  44. def __cinit__(self, iDevice device not None, LockdownServiceDescriptor descriptor, *args, **kwargs):
  45. self.handle_error(diagnostics_relay_client_new(device._c_dev, descriptor._c_service_descriptor, &self._c_client))
  46. def __dealloc__(self):
  47. cdef diagnostics_relay_error_t err
  48. if self._c_client is not NULL:
  49. err = diagnostics_relay_client_free(self._c_client)
  50. self.handle_error(err)
  51. cdef inline BaseError _error(self, int16_t ret):
  52. return DiagnosticsRelayError(ret)
  53. cpdef goodbye(self):
  54. self.handle_error(diagnostics_relay_goodbye(self._c_client))
  55. cpdef sleep(self):
  56. self.handle_error(diagnostics_relay_sleep(self._c_client))
  57. cpdef restart(self, int flags):
  58. self.handle_error(diagnostics_relay_restart(self._c_client, flags))
  59. cpdef shutdown(self, int flags):
  60. self.handle_error(diagnostics_relay_shutdown(self._c_client, flags))
  61. cpdef plist.Node request_diagnostics(self, bytes type):
  62. cdef:
  63. plist.plist_t c_node = NULL
  64. diagnostics_relay_error_t err
  65. err = diagnostics_relay_request_diagnostics(self._c_client, type, &c_node)
  66. try:
  67. self.handle_error(err)
  68. return plist.plist_t_to_node(c_node)
  69. except BaseError, e:
  70. if c_node != NULL:
  71. plist.plist_free(c_node)
  72. raise
  73. cpdef plist.Node query_mobilegestalt(self, plist.Node keys = None):
  74. cdef:
  75. plist.plist_t c_node = NULL
  76. diagnostics_relay_error_t err
  77. plist.plist_t keys_c_node = NULL
  78. if keys is not None:
  79. keys_c_node = keys._c_node
  80. err = diagnostics_relay_query_mobilegestalt(self._c_client, keys_c_node, &c_node)
  81. try:
  82. self.handle_error(err)
  83. return plist.plist_t_to_node(c_node)
  84. except BaseError, e:
  85. if c_node != NULL:
  86. plist.plist_free(c_node)
  87. raise
  88. cpdef plist.Node query_ioregistry_entry(self, bytes name, bytes class_name):
  89. cdef:
  90. plist.plist_t c_node = NULL
  91. diagnostics_relay_error_t err
  92. err = diagnostics_relay_query_ioregistry_entry(self._c_client, name, class_name, &c_node)
  93. try:
  94. self.handle_error(err)
  95. return plist.plist_t_to_node(c_node)
  96. except BaseError, e:
  97. if c_node != NULL:
  98. plist.plist_free(c_node)
  99. raise
  100. cpdef plist.Node query_ioregistry_plane(self, bytes plane = None):
  101. cdef:
  102. plist.plist_t c_node = NULL
  103. diagnostics_relay_error_t err
  104. err = diagnostics_relay_query_ioregistry_plane(self._c_client, plane, &c_node)
  105. try:
  106. self.handle_error(err)
  107. return plist.plist_t_to_node(c_node)
  108. except BaseError, e:
  109. if c_node != NULL:
  110. plist.plist_free(c_node)
  111. raise