diff options
author | Bryan Forbes | 2010-03-31 14:19:38 -0500 |
---|---|---|
committer | Martin Szulecki | 2012-03-20 23:25:55 +0100 |
commit | 23954a2b28e6f763a83524a85ead4716620ee7cc (patch) | |
tree | 33a4a940c26d7b7a228400ffcf6abbc0435958ae /cython/file_relay.pxi | |
parent | 7b4cb7fb2f1b1ed29f3bc97a9bcae5fc2a89fe95 (diff) | |
download | libimobiledevice-23954a2b28e6f763a83524a85ead4716620ee7cc.tar.gz libimobiledevice-23954a2b28e6f763a83524a85ead4716620ee7cc.tar.bz2 |
Added all remaining classes from libimobiledevice.
Diffstat (limited to 'cython/file_relay.pxi')
-rw-r--r-- | cython/file_relay.pxi | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/cython/file_relay.pxi b/cython/file_relay.pxi new file mode 100644 index 0000000..05c99f5 --- /dev/null +++ b/cython/file_relay.pxi @@ -0,0 +1,75 @@ +cdef extern from "libimobiledevice/file_relay.h": + cdef struct file_relay_client_private: + pass + ctypedef file_relay_client_private *file_relay_client_t + ctypedef char** const_sources_t "const char**" + + ctypedef enum file_relay_error_t: + FILE_RELAY_E_SUCCESS = 0 + FILE_RELAY_E_INVALID_ARG = -1 + FILE_RELAY_E_PLIST_ERROR = -2 + FILE_RELAY_E_MUX_ERROR = -3 + FILE_RELAY_E_INVALID_SOURCE = -4 + FILE_RELAY_E_STAGING_EMPTY = -5 + FILE_RELAY_E_UNKNOWN_ERROR = -256 + + file_relay_error_t file_relay_client_new(idevice_t device, uint16_t port, file_relay_client_t *client) + file_relay_error_t file_relay_client_free(file_relay_client_t client) + + file_relay_error_t file_relay_request_sources(file_relay_client_t client, const_sources_t sources, idevice_connection_t *connection) + +cdef class FileRelayError(BaseError): + def __init__(self, *args, **kwargs): + self._lookup_table = { + FILE_RELAY_E_SUCCESS: "Success", + FILE_RELAY_E_INVALID_ARG: "Invalid argument", + FILE_RELAY_E_PLIST_ERROR: "Property list error", + FILE_RELAY_E_MUX_ERROR: "MUX error", + FILE_RELAY_E_INVALID_SOURCE: "Invalid source", + FILE_RELAY_E_STAGING_EMPTY: "Staging empty", + FILE_RELAY_E_UNKNOWN_ERROR: "Unknown error" + } + BaseError.__init__(self, *args, **kwargs) + +cimport stdlib + +cdef class FileRelayClient(Base): + cdef file_relay_client_t _c_client + + def __cinit__(self, iDevice device not None, LockdownClient lockdown=None, *args, **kwargs): + cdef: + iDevice dev = device + LockdownClient lckd + file_relay_error_t err + if lockdown is None: + lckd = LockdownClient(dev) + else: + lckd = lockdown + port = lckd.start_service("com.apple.mobile.file_relay") + err = file_relay_client_new(dev._c_dev, port, &self._c_client) + self.handle_error(err) + + def __dealloc__(self): + cdef file_relay_error_t err + if self._c_client is not NULL: + err = file_relay_client_free(self._c_client) + self.handle_error(err) + + cpdef iDeviceConnection request_sources(self, list sources): + cdef: + file_relay_error_t err + Py_ssize_t count = len(sources) + char** c_sources = <char**>stdlib.malloc(sizeof(char*) * (count + 1)) + iDeviceConnection conn = iDeviceConnection.__new__(iDeviceConnection) + + for i, value in enumerate(sources): + c_sources[i] = value + c_sources[count] = NULL + + err = file_relay_request_sources(self._c_client, <const_sources_t>c_sources, &conn._c_connection) + free(c_sources) + self.handle_error(err) + return conn + + cdef inline BaseError _error(self, int16_t ret): + return FileRelayError(ret) |