| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- cdef extern from "libimobiledevice/installation_proxy.h":
- cdef struct instproxy_client_private:
- pass
- ctypedef instproxy_client_private *instproxy_client_t
- ctypedef void (*instproxy_status_cb_t) (plist.plist_t command, plist.plist_t status, void *user_data)
- ctypedef enum instproxy_error_t:
- INSTPROXY_E_SUCCESS = 0
- INSTPROXY_E_INVALID_ARG = -1
- INSTPROXY_E_PLIST_ERROR = -2
- INSTPROXY_E_CONN_FAILED = -3
- INSTPROXY_E_OP_IN_PROGRESS = -4
- INSTPROXY_E_OP_FAILED = -5
- INSTPROXY_E_UNKNOWN_ERROR = -256
- instproxy_error_t instproxy_client_new(idevice_t device, lockdownd_service_descriptor_t descriptor, instproxy_client_t *client)
- instproxy_error_t instproxy_client_free(instproxy_client_t client)
- instproxy_error_t instproxy_client_get_path_for_bundle_identifier(instproxy_client_t client, const char* bundle_id, char** path)
- instproxy_error_t instproxy_browse(instproxy_client_t client, plist.plist_t client_options, plist.plist_t *result)
- instproxy_error_t instproxy_install(instproxy_client_t client, char *pkg_path, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- instproxy_error_t instproxy_upgrade(instproxy_client_t client, char *pkg_path, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- instproxy_error_t instproxy_uninstall(instproxy_client_t client, char *appid, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist.plist_t client_options, plist.plist_t *result)
- instproxy_error_t instproxy_archive(instproxy_client_t client, char *appid, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- instproxy_error_t instproxy_restore(instproxy_client_t client, char *appid, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- instproxy_error_t instproxy_remove_archive(instproxy_client_t client, char *appid, plist.plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)
- cdef void instproxy_notify_cb(plist.plist_t command, plist.plist_t status, void *py_callback) with gil:
- (<object>py_callback)(plist.plist_t_to_node(command, False), plist.plist_t_to_node(status, False))
- cdef class InstallationProxyError(BaseError):
- def __init__(self, *args, **kwargs):
- self._lookup_table = {
- INSTPROXY_E_SUCCESS: "Success",
- INSTPROXY_E_INVALID_ARG: "Invalid argument",
- INSTPROXY_E_PLIST_ERROR: "Property list error",
- INSTPROXY_E_CONN_FAILED: "Connection failed",
- INSTPROXY_E_OP_IN_PROGRESS: "Operation in progress",
- INSTPROXY_E_OP_FAILED: "Operation failed",
- INSTPROXY_E_UNKNOWN_ERROR: "Unknown error"
- }
- BaseError.__init__(self, *args, **kwargs)
- cdef class InstallationProxyClient(PropertyListService):
- __service_name__ = "com.apple.mobile.installation_proxy"
- cdef instproxy_client_t _c_client
- def __cinit__(self, iDevice device not None, LockdownServiceDescriptor descriptor, *args, **kwargs):
- cdef:
- iDevice dev = device
- instproxy_error_t err
- err = instproxy_client_new(dev._c_dev, descriptor._c_service_descriptor, &self._c_client)
- self.handle_error(err)
- def __dealloc__(self):
- cdef instproxy_error_t err
- if self._c_client is not NULL:
- err = instproxy_client_free(self._c_client)
- self.handle_error(err)
- cpdef get_path_for_bundle_identifier(self, bytes bundle_id):
- cdef:
- char* c_bundle_id = bundle_id
- char* c_path = NULL
- bytes result
- try:
- self.handle_error(instproxy_client_get_path_for_bundle_identifier(self._c_client, c_bundle_id, &c_path))
- if c_path != NULL:
- result = c_path
- return result
- else:
- return None
- except BaseError, e:
- raise
- finally:
- free(c_path)
- cpdef plist.Node browse(self, object client_options):
- cdef:
- plist.Node options
- plist.plist_t c_options
- plist.plist_t c_result = NULL
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- err = instproxy_browse(self._c_client, c_options, &c_result)
- try:
- self.handle_error(err)
- return plist.plist_t_to_node(c_result)
- except Exception, e:
- if c_result != NULL:
- plist.plist_free(c_result)
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef install(self, bytes pkg_path, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_install(self._c_client, pkg_path, c_options, NULL, NULL)
- else:
- err = instproxy_install(self._c_client, pkg_path, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef upgrade(self, bytes pkg_path, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_upgrade(self._c_client, pkg_path, c_options, NULL, NULL)
- else:
- err = instproxy_upgrade(self._c_client, pkg_path, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef uninstall(self, bytes appid, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- instproxy_error_t err
- bint free_options = False
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_uninstall(self._c_client, appid, c_options, NULL, NULL)
- else:
- err = instproxy_uninstall(self._c_client, appid, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef plist.Node lookup_archives(self, object client_options):
- cdef:
- plist.Node options
- plist.plist_t c_options
- plist.plist_t c_node = NULL
- instproxy_error_t err
- bint free_options = False
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- err = instproxy_lookup_archives(self._c_client, c_options, &c_node)
- try:
- self.handle_error(err)
- return plist.plist_t_to_node(c_node)
- except Exception, e:
- if c_node != NULL:
- plist.plist_free(c_node)
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef archive(self, bytes appid, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_archive(self._c_client, appid, c_options, NULL, NULL)
- else:
- err = instproxy_archive(self._c_client, appid, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef restore(self, bytes appid, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_restore(self._c_client, appid, c_options, NULL, NULL)
- else:
- err = instproxy_restore(self._c_client, appid, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cpdef remove_archive(self, bytes appid, object client_options, object callback=None):
- cdef:
- plist.Node options
- plist.plist_t c_options
- bint free_options = False
- instproxy_error_t err
- if isinstance(client_options, plist.Dict):
- options = client_options
- c_options = options._c_node
- elif isinstance(client_options, dict):
- c_options = plist.native_to_plist_t(client_options)
- free_options = True
- else:
- raise InstallationProxyError(INSTPROXY_E_INVALID_ARG)
- if callback is None:
- err = instproxy_remove_archive(self._c_client, appid, c_options, NULL, NULL)
- else:
- err = instproxy_remove_archive(self._c_client, appid, c_options, instproxy_notify_cb, <void*>callback)
- try:
- self.handle_error(err)
- except Exception, e:
- raise
- finally:
- if free_options:
- plist.plist_free(c_options)
- cdef inline BaseError _error(self, int16_t ret):
- return InstallationProxyError(ret)
|