summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cython/Makefile.am10
-rw-r--r--cython/afc.pxi3
-rw-r--r--cython/imobiledevice.pxd7
-rw-r--r--cython/imobiledevice.pyx35
-rw-r--r--cython/installation_proxy.pxi2
-rw-r--r--cython/property_list_client.pxi12
-rw-r--r--cython/sbservices.pxi30
-rw-r--r--m4/ac_pkg_cython.m456
-rw-r--r--m4/cython_python.m47
9 files changed, 130 insertions, 32 deletions
diff --git a/cython/Makefile.am b/cython/Makefile.am
index 228ec0c..b1dea79 100644
--- a/cython/Makefile.am
+++ b/cython/Makefile.am
@@ -1,7 +1,7 @@
AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_CFLAGS = $(GLOBAL_CFLAGS) $(libusbmuxd_CFLAGS) $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(libplist_CFLAGS) $(LFS_CFLAGS)
-AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS) $(libplist_LIBS) $(libusbmuxd_LIBS) $(libgcrypt_LIBS)
+AM_CFLAGS = $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(LFS_CFLAGS)
+AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS)
if HAVE_CYTHON
@@ -30,9 +30,9 @@ EXTRA_DIST = imobiledevice.pyx imobiledevice.pxd $(PXIINCLUDES)
imobiledevicedir = $(pyexecdir)
imobiledevice_LTLIBRARIES = imobiledevice.la
imobiledevice_la_SOURCES = imobiledevice.pyx
-imobiledevice_la_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/src $(PYTHON_CPPFLAGS) $(libglib2_CFLAGS) $(libgthread2_CFLAGS)
-imobiledevice_la_LDFLAGS = -module -avoid-version $(PYTHON_LDFLAGS) $(libglib2_LIBS) $(libgthread2_LIBS)
-imobiledevice_la_LIBADD = $(top_builddir)/src/libimobiledevice.la
+imobiledevice_la_CFLAGS = -I../include -I../src $(PYTHON_CPPFLAGS) $(AM_CFLAGS)
+imobiledevice_la_LDFLAGS = -module -avoid-version -L$(libdir) $(PYTHON_LDFLAGS) $(AM_LDFLAGS)
+imobiledevice_la_LIBADD = ../src/libimobiledevice.la
imobiledevice.c: imobiledevice.pyx $(PXDINCLUDES) $(PXIINCLUDES)
diff --git a/cython/afc.pxi b/cython/afc.pxi
index ac9c927..1e2617a 100644
--- a/cython/afc.pxi
+++ b/cython/afc.pxi
@@ -66,9 +66,6 @@ cdef extern from "libimobiledevice/afc.h":
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 = {
diff --git a/cython/imobiledevice.pxd b/cython/imobiledevice.pxd
index 8efd669..6bf75af 100644
--- a/cython/imobiledevice.pxd
+++ b/cython/imobiledevice.pxd
@@ -54,10 +54,5 @@ cdef extern from "libimobiledevice/lockdown.h":
cdef class LockdownClient(Base):
cdef lockdownd_client_t _c_client
- cpdef int start_service(self, service)
+ cpdef int start_service(self, bytes service)
cpdef goodbye(self)
-
-cpdef set_debug_level(int level)
-cpdef event_subscribe(object callback)
-cpdef event_unsubscribe()
-cpdef get_device_list()
diff --git a/cython/imobiledevice.pyx b/cython/imobiledevice.pyx
index dc0fb88..b57db04 100644
--- a/cython/imobiledevice.pyx
+++ b/cython/imobiledevice.pyx
@@ -67,27 +67,40 @@ cdef class iDeviceError(BaseError):
}
BaseError.__init__(self, *args, **kwargs)
-cpdef set_debug_level(int level):
+def set_debug_level(int level):
idevice_set_debug_level(level)
cdef class iDeviceEvent:
def __init__(self, *args, **kwargs):
raise TypeError("iDeviceEvent cannot be instantiated")
-cdef void idevice_event_cb(const_idevice_event_t c_event, void *user_data):
+ def __str__(self):
+ return 'iDeviceEvent: %s (%s)' % (self.event == IDEVICE_DEVICE_ADD and 'Add' or 'Remove', self.uuid)
+
+ property event:
+ def __get__(self):
+ return self._c_event.event
+ property uuid:
+ def __get__(self):
+ return self._c_event.uuid
+ property conn_type:
+ def __get__(self):
+ return self._c_event.conn_type
+
+cdef void idevice_event_cb(const_idevice_event_t c_event, void *user_data) with gil:
cdef iDeviceEvent event = iDeviceEvent.__new__(iDeviceEvent)
event._c_event = c_event
(<object>user_data)(event)
-cpdef event_subscribe(object callback):
+def event_subscribe(object callback):
cdef iDeviceError err = iDeviceError(idevice_event_subscribe(idevice_event_cb, <void*>callback))
if err: raise err
-cpdef event_unsubscribe():
+def event_unsubscribe():
cdef iDeviceError err = iDeviceError(idevice_event_unsubscribe())
if err: raise err
-cpdef get_device_list():
+def get_device_list():
cdef:
char** devices
int count
@@ -214,10 +227,14 @@ cdef class LockdownError(BaseError):
BaseError.__init__(self, *args, **kwargs)
cdef class LockdownClient(Base):
- def __cinit__(self, iDevice device not None, char *label=NULL, *args, **kwargs):
+ def __cinit__(self, iDevice device not None, bytes label="", *args, **kwargs):
cdef:
iDevice dev = device
- lockdownd_error_t err = lockdownd_client_new_with_handshake(dev._c_dev, &(self._c_client), label)
+ lockdownd_error_t err
+ char* c_label = NULL
+ if label:
+ c_label = label
+ err = lockdownd_client_new_with_handshake(dev._c_dev, &(self._c_client), c_label)
self.handle_error(err)
def __dealloc__(self):
@@ -229,7 +246,7 @@ cdef class LockdownClient(Base):
cdef inline BaseError _error(self, int16_t ret):
return LockdownError(ret)
- cpdef int start_service(self, service):
+ cpdef int start_service(self, bytes service):
cdef:
uint16_t port
lockdownd_error_t err
@@ -242,6 +259,8 @@ cdef class LockdownClient(Base):
cdef extern from *:
ctypedef char* const_char_ptr "const char*"
+ void free(void *ptr)
+ void plist_free(plist.plist_t node)
include "property_list_client.pxi"
include "mobilesync.pxi"
diff --git a/cython/installation_proxy.pxi b/cython/installation_proxy.pxi
index 22e7e38..a8083d3 100644
--- a/cython/installation_proxy.pxi
+++ b/cython/installation_proxy.pxi
@@ -26,7 +26,7 @@ cdef extern from "libimobiledevice/installation_proxy.h":
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(const_char_ptr operation, plist.plist_t status, void *py_callback):
+cdef void instproxy_notify_cb(const_char_ptr operation, plist.plist_t status, void *py_callback) with gil:
(<object>py_callback)(operation, plist.plist_t_to_node(status, False))
cdef class InstallationProxyError(BaseError):
diff --git a/cython/property_list_client.pxi b/cython/property_list_client.pxi
index 874f2b5..2f9ce76 100644
--- a/cython/property_list_client.pxi
+++ b/cython/property_list_client.pxi
@@ -4,8 +4,16 @@ cdef class PropertyListClient(Base):
self.handle_error(self._send(n._c_node))
cpdef object receive(self):
- cdef plist.plist_t c_node = NULL
- self.handle_error(self._receive(&c_node))
+ cdef:
+ plist.plist_t c_node = NULL
+ int16_t err
+ err = self._receive(&c_node)
+ try:
+ self.handle_error(err)
+ except BaseError, e:
+ if c_node != NULL:
+ plist_free(c_node)
+ raise
return plist.plist_t_to_node(c_node)
diff --git a/cython/sbservices.pxi b/cython/sbservices.pxi
index f458bec..6eece0a 100644
--- a/cython/sbservices.pxi
+++ b/cython/sbservices.pxi
@@ -29,14 +29,16 @@ cdef class SpringboardServicesClient(Base):
cdef sbservices_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
if lockdown is None:
lckd = LockdownClient(dev)
else:
lckd = lockdown
- port = lockdown.start_service("com.apple.springboardservices")
- self.handle_error(sbservices_client_new(dev._c_dev, port, &(self._c_client)))
+ port = lckd.start_service("com.apple.springboardservices")
+ err = SpringboardServicesError(sbservices_client_new(dev._c_dev, port, &(self._c_client)))
+ if err: raise err
def __dealloc__(self):
if self._c_client is not NULL:
@@ -51,7 +53,14 @@ cdef class SpringboardServicesClient(Base):
cdef:
plist.plist_t c_node = NULL
plist.Node node
- self.handle_error(sbservices_get_icon_state(self._c_client, &c_node))
+ sbservices_error_t err
+ err = sbservices_get_icon_state(self._c_client, &c_node)
+ try:
+ self.handle_error(err)
+ except BaseError, e:
+ if c_node != NULL:
+ plist_free(c_node)
+ raise
node = plist.plist_t_to_node(c_node)
return node
def __set__(self, plist.Node newstate not None):
@@ -63,6 +72,13 @@ cdef class SpringboardServicesClient(Base):
bytes result
char* pngdata = NULL
uint64_t pngsize
- self.handle_error(sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize))
- result = pngdata[:pngsize]
+ sbservices_error_t err
+ err = sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize)
+ try:
+ self.handle_error(err)
+ except BaseError, e:
+ raise
+ finally:
+ result = pngdata[:pngsize]
+ free(pngdata)
return result
diff --git a/m4/ac_pkg_cython.m4 b/m4/ac_pkg_cython.m4
new file mode 100644
index 0000000..aeae6a0
--- /dev/null
+++ b/m4/ac_pkg_cython.m4
@@ -0,0 +1,56 @@
+
+AC_DEFUN([AC_PROG_CYTHON],[
+ AC_PATH_PROG([CYTHON],[cython])
+ if test -z "$CYTHON" ; then
+ AC_MSG_WARN([cannot find 'cython' program. You should look at http://www.cython.org] or install your distribution specific cython package.)
+ CYTHON=false
+ elif test -n "$1" ; then
+ AC_MSG_CHECKING([for Cython version])
+ [cython_version=`$CYTHON --version 2>&1 | grep 'Cython version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`]
+ AC_MSG_RESULT([$cython_version])
+ if test -n "$cython_version" ; then
+ # Calculate the required version number components
+ [required=$1]
+ [required_major=`echo $required | sed 's/[^0-9].*//'`]
+ if test -z "$required_major" ; then
+ [required_major=0]
+ fi
+ [required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
+ [required_minor=`echo $required | sed 's/[^0-9].*//'`]
+ if test -z "$required_minor" ; then
+ [required_minor=0]
+ fi
+ [required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
+ [required_patch=`echo $required | sed 's/[^0-9].*//'`]
+ if test -z "$required_patch" ; then
+ [required_patch=0]
+ fi
+ # Calculate the available version number components
+ [available=$cython_version]
+ [available_major=`echo $available | sed 's/[^0-9].*//'`]
+ if test -z "$available_major" ; then
+ [available_major=0]
+ fi
+ [available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
+ [available_minor=`echo $available | sed 's/[^0-9].*//'`]
+ if test -z "$available_minor" ; then
+ [available_minor=0]
+ fi
+ [available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
+ [available_patch=`echo $available | sed 's/[^0-9].*//'`]
+ if test -z "$available_patch" ; then
+ [available_patch=0]
+ fi
+ if test $available_major -ne $required_major \
+ -o $available_minor -ne $required_minor \
+ -o $available_patch -lt $required_patch ; then
+ AC_MSG_WARN([Cython version >= $1 is required. You have $cython_version. You should look at http://www.cython.org])
+ CYTHON=false
+ fi
+ else
+ AC_MSG_WARN([cannot determine Cython version])
+ CYTHON=false
+ fi
+ fi
+ AC_SUBST([CYTHON_LIB])
+])
diff --git a/m4/cython_python.m4 b/m4/cython_python.m4
new file mode 100644
index 0000000..ba730d5
--- /dev/null
+++ b/m4/cython_python.m4
@@ -0,0 +1,7 @@
+AC_DEFUN([CYTHON_PYTHON],[
+ AC_REQUIRE([AC_PROG_CYTHON])
+ AC_REQUIRE([AC_PYTHON_DEVEL])
+ test "x$1" != "xno" || cython_shadow=" -noproxy"
+ AC_SUBST([CYTHON_PYTHON_OPT],[-python$cython_shadow])
+ AC_SUBST([CYTHON_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS])
+])