From 7b4cb7fb2f1b1ed29f3bc97a9bcae5fc2a89fe95 Mon Sep 17 00:00:00 2001 From: Bryan Forbes Date: Thu, 18 Mar 2010 20:50:26 -0500 Subject: Added afc.pxi. More errors handled. Changed error codes to enums in cython defs. --- cython/Makefile.am | 15 ++-- cython/afc.pxi | 165 ++++++++++++++++++++++++++++++++++++++++ cython/imobiledevice.pxd | 1 - cython/imobiledevice.pyx | 60 ++++++++------- cython/mobilebackup.pxi | 14 ++-- cython/mobilesync.pxi | 14 ++-- cython/notification_proxy.pxi | 50 +++++++----- cython/property_list_client.pxi | 2 +- cython/sbservices.pxi | 47 +++++++----- cython/stdint.pxi | 2 + 10 files changed, 283 insertions(+), 87 deletions(-) create mode 100644 cython/afc.pxi diff --git a/cython/Makefile.am b/cython/Makefile.am index 1a71fbe..c0ebff6 100644 --- a/cython/Makefile.am +++ b/cython/Makefile.am @@ -7,13 +7,14 @@ if HAVE_CYTHON BUILT_SOURCES = imobiledevice.c PXDINCLUDES = imobiledevice.pxd stdint.pxi $(CYTHON_PLIST_INCLUDE_DIR)/plist.pxd -PXIINCLUDES = \ - stdint.pxi \ - mobilesync.pxi \ - notification_proxy.pxi \ - sbservices.pxi \ - mobilebackup.pxi \ - property_list_client.pxi +PXIINCLUDES = \ + stdint.pxi \ + mobilesync.pxi \ + notification_proxy.pxi \ + sbservices.pxi \ + mobilebackup.pxi \ + property_list_client.pxi \ + afc.pxi CLEANFILES = \ *.pyc \ diff --git a/cython/afc.pxi b/cython/afc.pxi new file mode 100644 index 0000000..51251c8 --- /dev/null +++ b/cython/afc.pxi @@ -0,0 +1,165 @@ +cdef extern from "libimobiledevice/afc.h": + cdef struct afc_client_int: + pass + ctypedef afc_client_int *afc_client_t + ctypedef enum afc_error_t: + AFC_E_SUCCESS = 0 + AFC_E_UNKNOWN_ERROR = 1 + AFC_E_OP_HEADER_INVALID = 2 + AFC_E_NO_RESOURCES = 3 + AFC_E_READ_ERROR = 4 + AFC_E_WRITE_ERROR = 5 + AFC_E_UNKNOWN_PACKET_TYPE = 6 + AFC_E_INVALID_ARGUMENT = 7 + AFC_E_OBJECT_NOT_FOUND = 8 + AFC_E_OBJECT_IS_DIR = 9 + AFC_E_PERM_DENIED = 10 + AFC_E_SERVICE_NOT_CONNECTED = 11 + AFC_E_OP_TIMEOUT = 12 + AFC_E_TOO_MUCH_DATA = 13 + AFC_E_END_OF_DATA = 14 + AFC_E_OP_NOT_SUPPORTED = 15 + AFC_E_OBJECT_EXISTS = 16 + AFC_E_OBJECT_BUSY = 17 + AFC_E_NO_SPACE_LEFT = 18 + AFC_E_OP_WOULD_BLOCK = 19 + AFC_E_IO_ERROR = 20 + AFC_E_OP_INTERRUPTED = 21 + AFC_E_OP_IN_PROGRESS = 22 + AFC_E_INTERNAL_ERROR = 23 + AFC_E_MUX_ERROR = 30 + AFC_E_NO_MEM = 31 + AFC_E_NOT_ENOUGH_DATA = 32 + AFC_E_DIR_NOT_EMPTY = 33 + ctypedef enum afc_file_mode_t: + AFC_FOPEN_RDONLY = 0x00000001 + AFC_FOPEN_RW = 0x00000002 + AFC_FOPEN_WRONLY = 0x00000003 + AFC_FOPEN_WR = 0x00000004 + AFC_FOPEN_APPEND = 0x00000005 + AFC_FOPEN_RDAPPEND = 0x00000006 + ctypedef enum afc_link_type_t: + AFC_HARDLINK = 1 + AFC_SYMLINK = 2 + ctypedef enum afc_lock_op_t: + AFC_LOCK_SH = 1 | 4 + AFC_LOCK_EX = 2 | 4 + AFC_LOCK_UN = 8 | 4 + + afc_error_t afc_client_new(idevice_t device, uint16_t port, afc_client_t *client) + afc_error_t afc_client_free(afc_client_t client) + afc_error_t afc_get_device_info(afc_client_t client, char ***infos) + afc_error_t afc_read_directory(afc_client_t client, char *dir, char ***list) + afc_error_t afc_get_file_info(afc_client_t client, char *filename, char ***infolist) + afc_error_t afc_file_open(afc_client_t client, char *filename, afc_file_mode_t file_mode, uint64_t *handle) + afc_error_t afc_file_close(afc_client_t client, uint64_t handle) + afc_error_t afc_file_lock(afc_client_t client, uint64_t handle, afc_lock_op_t operation) + afc_error_t afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, uint32_t *bytes_read) + afc_error_t afc_file_write(afc_client_t client, uint64_t handle, char *data, uint32_t length, uint32_t *bytes_written) + afc_error_t afc_file_seek(afc_client_t client, uint64_t handle, int64_t offset, int whence) + afc_error_t afc_file_tell(afc_client_t client, uint64_t handle, uint64_t *position) + afc_error_t afc_file_truncate(afc_client_t client, uint64_t handle, uint64_t newsize) + afc_error_t afc_remove_path(afc_client_t client, char *path) + afc_error_t afc_rename_path(afc_client_t client, char *f, char *to) + afc_error_t afc_make_directory(afc_client_t client, char *dir) + afc_error_t afc_truncate(afc_client_t client, char *path, uint64_t newsize) + afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, char *target, char *linkname) + afc_error_t afc_set_file_time(afc_client_t client, char *path, uint64_t mtime) + +cdef extern from *: + void free(void *ptr) + +cdef class AfcError(BaseError): + def __init__(self, *args, **kwargs): + self._lookup_table = { + AFC_E_SUCCESS: "Success", + AFC_E_UNKNOWN_ERROR: "Unknown error", + AFC_E_OP_HEADER_INVALID: "OP header invalid", + AFC_E_NO_RESOURCES: "No resources", + AFC_E_READ_ERROR: "Read error", + AFC_E_WRITE_ERROR: "Write error", + AFC_E_UNKNOWN_PACKET_TYPE: "Unknown packet type", + AFC_E_INVALID_ARGUMENT: "Invalid argument", + AFC_E_OBJECT_NOT_FOUND: "Object not found", + AFC_E_OBJECT_IS_DIR: "Object is directory", + AFC_E_PERM_DENIED: "Permission denied", + AFC_E_SERVICE_NOT_CONNECTED: "Service not connected", + AFC_E_OP_TIMEOUT: "OP timeout", + AFC_E_TOO_MUCH_DATA: "Too much data", + AFC_E_END_OF_DATA: "End of data", + AFC_E_OP_NOT_SUPPORTED: "OP not supported", + AFC_E_OBJECT_EXISTS: "Object exists", + AFC_E_OBJECT_BUSY: "Object busy", + AFC_E_NO_SPACE_LEFT: "No space left", + AFC_E_OP_WOULD_BLOCK: "OP would block", + AFC_E_IO_ERROR: "IO error", + AFC_E_OP_INTERRUPTED: "OP interrupted", + AFC_E_OP_IN_PROGRESS: "OP in progress", + AFC_E_INTERNAL_ERROR: "Internal error", + AFC_E_MUX_ERROR: "MUX error", + AFC_E_NO_MEM: "No memory", + AFC_E_NOT_ENOUGH_DATA: "Not enough data", + AFC_E_DIR_NOT_EMPTY: "Directory not empty" + } + BaseError.__init__(self, *args, **kwargs) + +cdef class AfcClient(Base): + cdef afc_client_t _c_client + + def __cinit__(self, iDevice device not None, LockdownClient lockdown=None, *args, **kwargs): + cdef: + iDevice dev = device + LockdownClient lckd + afc_error_t err + if lockdown is None: + lckd = LockdownClient(dev) + else: + lckd = lockdown + port = lckd.start_service("com.apple.afc") + err = afc_client_new(dev._c_dev, port, &(self._c_client)) + self.handle_error(err) + + def __dealloc__(self): + cdef afc_error_t err + if self._c_client is not NULL: + err = afc_client_free(self._c_client) + self.handle_error(err) + + cdef inline BaseError _error(self, int16_t ret): + return AfcError(ret) + + cpdef list get_device_info(self): + cdef: + afc_error_t err + char** infos + bytes info + int i = 0 + list result = [] + err = afc_get_device_info(self._c_client, &infos) + self.handle_error(err) + while infos[i]: + info = infos[i] + result.append(info) + free(infos[i]) + i = i + 1 + free(infos) + + return result + + cpdef list read_directory(self, bytes directory): + cdef: + afc_error_t err + char** dir_list + bytes f + int i = 0 + list result = [] + err = afc_read_directory(self._c_client, directory, &dir_list) + self.handle_error(err) + while dir_list[i]: + f = dir_list[i] + result.append(f) + free(dir_list[i]) + i = i + 1 + free(dir_list) + + return result diff --git a/cython/imobiledevice.pxd b/cython/imobiledevice.pxd index 0557d37..8a7d6b2 100644 --- a/cython/imobiledevice.pxd +++ b/cython/imobiledevice.pxd @@ -20,7 +20,6 @@ cdef extern from "libimobiledevice/libimobiledevice.h": cdef struct idevice_int: pass ctypedef idevice_int* idevice_t - ctypedef int16_t idevice_error_t cdef enum idevice_event_type: IDEVICE_DEVICE_ADD = 1, IDEVICE_DEVICE_REMOVE diff --git a/cython/imobiledevice.pyx b/cython/imobiledevice.pyx index c6a96dd..ecf94e1 100644 --- a/cython/imobiledevice.pyx +++ b/cython/imobiledevice.pyx @@ -30,13 +30,14 @@ cdef class Base: cdef inline BaseError _error(self, int16_t ret): pass cdef extern from "libimobiledevice/libimobiledevice.h": - int16_t IDEVICE_E_SUCCESS - int16_t IDEVICE_E_INVALID_ARG - int16_t IDEVICE_E_UNKNOWN_ERROR - int16_t IDEVICE_E_NO_DEVICE - int16_t IDEVICE_E_NOT_ENOUGH_DATA - int16_t IDEVICE_E_BAD_HEADER - int16_t IDEVICE_E_SSL_ERROR + ctypedef enum idevice_error_t: + IDEVICE_E_SUCCESS = 0 + IDEVICE_E_INVALID_ARG = -1 + IDEVICE_E_UNKNOWN_ERROR = -2 + IDEVICE_E_NO_DEVICE = -3 + IDEVICE_E_NOT_ENOUGH_DATA = -4 + IDEVICE_E_BAD_HEADER = -5 + IDEVICE_E_SSL_ERROR = -6 ctypedef void (*idevice_event_cb_t) (const_idevice_event_t event, void *user_data) cdef extern idevice_error_t idevice_event_subscribe(idevice_event_cb_t callback, void *user_data) cdef extern idevice_error_t idevice_event_unsubscribe() @@ -49,7 +50,7 @@ cdef extern from "libimobiledevice/libimobiledevice.h": idevice_error_t idevice_get_handle(idevice_t device, uint32_t *handle) cdef class iDeviceError(BaseError): - def __cinit__(self, *args, **kwargs): + def __init__(self, *args, **kwargs): self._lookup_table = { IDEVICE_E_SUCCESS: 'Success', IDEVICE_E_INVALID_ARG: 'Invalid argument', @@ -133,27 +134,27 @@ cdef extern from "libimobiledevice/lockdown.h": cdef struct lockdownd_client_int: pass ctypedef lockdownd_client_int *lockdownd_client_t - ctypedef int16_t lockdownd_error_t - int16_t LOCKDOWN_E_SUCCESS - int16_t LOCKDOWN_E_INVALID_ARG - int16_t LOCKDOWN_E_INVALID_CONF - int16_t LOCKDOWN_E_PLIST_ERROR - int16_t LOCKDOWN_E_PAIRING_FAILED - int16_t LOCKDOWN_E_SSL_ERROR - int16_t LOCKDOWN_E_DICT_ERROR - int16_t LOCKDOWN_E_START_SERVICE_FAILED - int16_t LOCKDOWN_E_NOT_ENOUGH_DATA - int16_t LOCKDOWN_E_SET_VALUE_PROHIBITED - int16_t LOCKDOWN_E_GET_VALUE_PROHIBITED - int16_t LOCKDOWN_E_REMOVE_VALUE_PROHIBITED - int16_t LOCKDOWN_E_MUX_ERROR - int16_t LOCKDOWN_E_ACTIVATION_FAILED - int16_t LOCKDOWN_E_PASSWORD_PROTECTED - int16_t LOCKDOWN_E_NO_RUNNING_SESSION - int16_t LOCKDOWN_E_INVALID_HOST_ID - int16_t LOCKDOWN_E_INVALID_SERVICE - int16_t LOCKDOWN_E_INVALID_ACTIVATION_RECORD - int16_t LOCKDOWN_E_UNKNOWN_ERROR + ctypedef enum lockdownd_error_t: + LOCKDOWN_E_SUCCESS = 0 + LOCKDOWN_E_INVALID_ARG = -1 + LOCKDOWN_E_INVALID_CONF = -2 + LOCKDOWN_E_PLIST_ERROR = -3 + LOCKDOWN_E_PAIRING_FAILED = -4 + LOCKDOWN_E_SSL_ERROR = -5 + LOCKDOWN_E_DICT_ERROR = -6 + LOCKDOWN_E_START_SERVICE_FAILED = -7 + LOCKDOWN_E_NOT_ENOUGH_DATA = -8 + LOCKDOWN_E_SET_VALUE_PROHIBITED = -9 + LOCKDOWN_E_GET_VALUE_PROHIBITED = -10 + LOCKDOWN_E_REMOVE_VALUE_PROHIBITED = -11 + LOCKDOWN_E_MUX_ERROR = -12 + LOCKDOWN_E_ACTIVATION_FAILED = -13 + LOCKDOWN_E_PASSWORD_PROTECTED = -14 + LOCKDOWN_E_NO_RUNNING_SESSION = -15 + LOCKDOWN_E_INVALID_HOST_ID = -16 + LOCKDOWN_E_INVALID_SERVICE = -17 + LOCKDOWN_E_INVALID_ACTIVATION_RECORD = -18 + LOCKDOWN_E_UNKNOWN_ERROR = -256 lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdownd_client_t *client, char *label) lockdownd_error_t lockdownd_client_free(lockdownd_client_t client) @@ -217,3 +218,4 @@ include "mobilesync.pxi" include "notification_proxy.pxi" include "sbservices.pxi" include "mobilebackup.pxi" +include "afc.pxi" diff --git a/cython/mobilebackup.pxi b/cython/mobilebackup.pxi index f6b13a9..53a4b6f 100644 --- a/cython/mobilebackup.pxi +++ b/cython/mobilebackup.pxi @@ -3,13 +3,13 @@ cdef extern from "libimobiledevice/mobilebackup.h": pass ctypedef mobilebackup_client_int *mobilebackup_client_t - ctypedef int16_t mobilebackup_error_t - int16_t MOBILEBACKUP_E_SUCCESS - int16_t MOBILEBACKUP_E_INVALID_ARG - int16_t MOBILEBACKUP_E_PLIST_ERROR - int16_t MOBILEBACKUP_E_MUX_ERROR - int16_t MOBILEBACKUP_E_BAD_VERSION - int16_t MOBILEBACKUP_E_UNKNOWN_ERROR + ctypedef enum mobilebackup_error_t: + MOBILEBACKUP_E_SUCCESS = 0 + MOBILEBACKUP_E_INVALID_ARG = -1 + MOBILEBACKUP_E_PLIST_ERROR = -2 + MOBILEBACKUP_E_MUX_ERROR = -3 + MOBILEBACKUP_E_BAD_VERSION = -4 + MOBILEBACKUP_E_UNKNOWN_ERROR = -256 mobilebackup_error_t mobilebackup_client_new(idevice_t device, uint16_t port, mobilebackup_client_t * client) mobilebackup_error_t mobilebackup_client_free(mobilebackup_client_t client) diff --git a/cython/mobilesync.pxi b/cython/mobilesync.pxi index abd56b4..87539d2 100644 --- a/cython/mobilesync.pxi +++ b/cython/mobilesync.pxi @@ -3,13 +3,13 @@ cdef extern from "libimobiledevice/mobilesync.h": pass ctypedef mobilesync_client_int *mobilesync_client_t - ctypedef int16_t mobilesync_error_t - int16_t MOBILESYNC_E_SUCCESS - int16_t MOBILESYNC_E_INVALID_ARG - int16_t MOBILESYNC_E_PLIST_ERROR - int16_t MOBILESYNC_E_MUX_ERROR - int16_t MOBILESYNC_E_BAD_VERSION - int16_t MOBILESYNC_E_UNKNOWN_ERROR + ctypedef enum mobilesync_error_t: + MOBILESYNC_E_SUCCESS = 0 + MOBILESYNC_E_INVALID_ARG = -1 + MOBILESYNC_E_PLIST_ERROR = -2 + MOBILESYNC_E_MUX_ERROR = -3 + MOBILESYNC_E_BAD_VERSION = -4 + MOBILESYNC_E_UNKNOWN_ERROR = -256 mobilesync_error_t mobilesync_client_new(idevice_t device, uint16_t port, mobilesync_client_t * client) mobilesync_error_t mobilesync_client_free(mobilesync_client_t client) diff --git a/cython/notification_proxy.pxi b/cython/notification_proxy.pxi index acccf7d..2ca484a 100644 --- a/cython/notification_proxy.pxi +++ b/cython/notification_proxy.pxi @@ -5,7 +5,12 @@ cdef extern from "libimobiledevice/notification_proxy.h": cdef struct np_client_int: pass ctypedef np_client_int *np_client_t - ctypedef int16_t np_error_t + ctypedef enum np_error_t: + NP_E_SUCCESS = 0 + NP_E_INVALID_ARG = -1 + NP_E_PLIST_ERROR = -2 + NP_E_CONN_FAILED = -3 + NP_E_UNKNOWN_ERROR = -256 ctypedef void (*np_notify_cb_t) (const_char_ptr notification, void *userdata) np_error_t np_client_new(idevice_t device, uint16_t port, np_client_t *client) np_error_t np_client_free(np_client_t client) @@ -18,35 +23,46 @@ cdef void np_notify_cb(const_char_ptr notification, void *py_callback): (py_callback)(notification) cdef class NotificationProxyError(BaseError): - pass + def __init__(self, *args, **kwargs): + self._lookup_table = { + NP_E_SUCCESS: "Success", + NP_E_INVALID_ARG: "Invalid argument", + NP_E_PLIST_ERROR: "PList Error", + NP_E_CONN_FAILED: "Connection Failed", + NP_E_UNKNOWN_ERROR: "Unknown Error" + } + BaseError.__init__(self, *args, **kwargs) -cdef class NotificationProxy: +cdef class NotificationProxy(Base): cdef np_client_t _c_client def __cinit__(self, iDevice device not None, LockdownClient lockdown=None, *args, **kwargs): - cdef iDevice dev = device - cdef LockdownClient lckd + cdef: + iDevice dev = device + LockdownClient lckd + np_error_t err if lockdown is None: lckd = LockdownClient(dev) else: lckd = lockdown port = lckd.start_service("com.apple.mobile.notification_proxy") - err = NotificationProxyError(np_client_new(dev._c_dev, port, &(self._c_client))) - if err: raise err + err = np_client_new(dev._c_dev, port, &self._c_client) + self.handle_error(err) def __dealloc__(self): + cdef np_error_t err if self._c_client is not NULL: - err = NotificationProxyError(np_client_free(self._c_client)) - if err: raise err - + err = np_client_free(self._c_client) + self.handle_error(err) + + cdef inline BaseError _error(self, int16_t ret): + return NotificationProxyError(ret) + cpdef set_notify_callback(self, object callback): - err = NotificationProxyError(np_set_notify_callback(self._c_client, np_notify_cb, callback)) - if err: raise err - + self.handle_error(np_set_notify_callback(self._c_client, np_notify_cb, callback)) + cpdef observe_notification(self, bytes notification): - err = NotificationProxyError(np_observe_notification(self._c_client, notification)) - if err: raise err + self.handle_error(np_observe_notification(self._c_client, notification)) cpdef post_notification(self, bytes notification): - err = NotificationProxyError(np_post_notification(self._c_client, notification)) - if err: raise err + self.handle_error(np_post_notification(self._c_client, notification)) diff --git a/cython/property_list_client.pxi b/cython/property_list_client.pxi index 2689658..874f2b5 100644 --- a/cython/property_list_client.pxi +++ b/cython/property_list_client.pxi @@ -3,7 +3,7 @@ cdef class PropertyListClient(Base): cdef plist.Node n = node self.handle_error(self._send(n._c_node)) - cpdef plist.Node receive(self): + cpdef object receive(self): cdef plist.plist_t c_node = NULL self.handle_error(self._receive(&c_node)) diff --git a/cython/sbservices.pxi b/cython/sbservices.pxi index cb9de59..384c92b 100644 --- a/cython/sbservices.pxi +++ b/cython/sbservices.pxi @@ -2,7 +2,12 @@ cdef extern from "libimobiledevice/sbservices.h": cdef struct sbservices_client_int: pass ctypedef sbservices_client_int *sbservices_client_t - ctypedef int16_t sbservices_error_t + ctypedef enum sbservices_error_t: + SBSERVICES_E_SUCCESS = 0 + SBSERVICES_E_INVALID_ARG = -1 + SBSERVICES_E_PLIST_ERROR = -2 + SBSERVICES_E_CONN_FAILED = -3 + SBSERVICES_E_UNKNOWN_ERROR = -256 sbservices_error_t sbservices_client_new(idevice_t device, uint16_t port, sbservices_client_t *client) sbservices_error_t sbservices_client_free(sbservices_client_t client) sbservices_error_t sbservices_get_icon_state(sbservices_client_t client, plist.plist_t *state) @@ -10,7 +15,15 @@ cdef extern from "libimobiledevice/sbservices.h": sbservices_error_t sbservices_get_icon_pngdata(sbservices_client_t client, char *bundleId, char **pngdata, uint64_t *pngsize) cdef class SpringboardServicesError(BaseError): - pass + def __init__(self, *args, **kwargs): + self._lookup_table = { + SBSERVICES_E_SUCCESS: "Success", + SBSERVICES_E_INVALID_ARG: "Invalid argument", + SBSERVICES_E_PLIST_ERROR: "PList Error", + SBSERVICES_E_CONN_FAILED: "Connection Failed", + SBSERVICES_E_UNKNOWN_ERROR: "Unknown Error" + } + BaseError.__init__(self, *args, **kwargs) cdef class SpringboardServices: cdef sbservices_client_t _c_client @@ -23,35 +36,33 @@ cdef class SpringboardServices: else: lckd = lockdown port = lockdown.start_service("com.apple.springboardservices") - err = SpringboardServicesError(sbservices_client_new(dev._c_dev, port, &(self._c_client))) - if err: raise err + self.handle_error(sbservices_client_new(dev._c_dev, port, &(self._c_client))) def __dealloc__(self): if self._c_client is not NULL: err = SpringboardServicesError(sbservices_client_free(self._c_client)) if err: raise err + cdef inline BaseError _error(self, int16_t ret): + return SpringboardServicesError(ret) + property icon_state: def __get__(self): - cdef plist.plist_t c_node = NULL - cdef plist.Node node - cdef SpringboardServicesError err = \ - SpringboardServicesError(sbservices_get_icon_state(self._c_client, &c_node)) - if err: raise err + cdef: + plist.plist_t c_node = NULL + plist.Node node + self.handle_error(sbservices_get_icon_state(self._c_client, &c_node)) node = plist.plist_t_to_node(c_node) return node def __set__(self, plist.Node newstate not None): cdef plist.Node node = newstate - cdef SpringboardServicesError err = \ - SpringboardServicesError(sbservices_set_icon_state(self._c_client, node._c_node)) - if err: raise err + self.handle_error(sbservices_set_icon_state(self._c_client, node._c_node)) cpdef bytes get_pngdata(self, bytes bundleId): - cdef bytes result - cdef char* pngdata = NULL - cdef uint64_t pngsize - cdef SpringboardServicesError err = \ - SpringboardServicesError(sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize)) - if err: raise err + cdef: + bytes result + char* pngdata = NULL + uint64_t pngsize + self.handle_error(sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize)) result = pngdata[:pngsize] return result diff --git a/cython/stdint.pxi b/cython/stdint.pxi index e21103f..2617dec 100644 --- a/cython/stdint.pxi +++ b/cython/stdint.pxi @@ -5,6 +5,8 @@ cdef extern from *: ctypedef unsigned int uint32_t ctypedef int int32_t IF UNAME_MACHINE == 'x86_64': + ctypedef long int int64_t ctypedef unsigned long int uint64_t ELSE: + ctypedef long long int int64_t ctypedef unsigned long long int uint64_t -- cgit v1.1-32-gdbae