summaryrefslogtreecommitdiffstats
path: root/cython
diff options
context:
space:
mode:
authorGravatar Bryan Forbes2010-04-01 01:09:52 -0500
committerGravatar Martin Szulecki2012-03-20 23:25:55 +0100
commitacac4f819ccafa6f6bb945626f2e21ec2b75074b (patch)
treefc6881c387ee1e4527ed2b3ca73d1059bc8fc4f2 /cython
parentaf06ff22149191c056804e7fec9c1a6880a06872 (diff)
downloadlibimobiledevice-acac4f819ccafa6f6bb945626f2e21ec2b75074b.tar.gz
libimobiledevice-acac4f819ccafa6f6bb945626f2e21ec2b75074b.tar.bz2
Cleaned up Makefile.am.
Added the cython m4 files. Cleaned up afc.pxi. Make sure the event callback and installation proxy callback aquire the GIL. Implemented some cleanup before the error handlers raise.
Diffstat (limited to 'cython')
-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
7 files changed, 67 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 @@
1AM_CPPFLAGS = -I$(top_srcdir)/include 1AM_CPPFLAGS = -I$(top_srcdir)/include
2 2
3AM_CFLAGS = $(GLOBAL_CFLAGS) $(libusbmuxd_CFLAGS) $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(libplist_CFLAGS) $(LFS_CFLAGS) 3AM_CFLAGS = $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(LFS_CFLAGS)
4AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS) $(libplist_LIBS) $(libusbmuxd_LIBS) $(libgcrypt_LIBS) 4AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS)
5 5
6if HAVE_CYTHON 6if HAVE_CYTHON
7 7
@@ -30,9 +30,9 @@ EXTRA_DIST = imobiledevice.pyx imobiledevice.pxd $(PXIINCLUDES)
30imobiledevicedir = $(pyexecdir) 30imobiledevicedir = $(pyexecdir)
31imobiledevice_LTLIBRARIES = imobiledevice.la 31imobiledevice_LTLIBRARIES = imobiledevice.la
32imobiledevice_la_SOURCES = imobiledevice.pyx 32imobiledevice_la_SOURCES = imobiledevice.pyx
33imobiledevice_la_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/src $(PYTHON_CPPFLAGS) $(libglib2_CFLAGS) $(libgthread2_CFLAGS) 33imobiledevice_la_CFLAGS = -I../include -I../src $(PYTHON_CPPFLAGS) $(AM_CFLAGS)
34imobiledevice_la_LDFLAGS = -module -avoid-version $(PYTHON_LDFLAGS) $(libglib2_LIBS) $(libgthread2_LIBS) 34imobiledevice_la_LDFLAGS = -module -avoid-version -L$(libdir) $(PYTHON_LDFLAGS) $(AM_LDFLAGS)
35imobiledevice_la_LIBADD = $(top_builddir)/src/libimobiledevice.la 35imobiledevice_la_LIBADD = ../src/libimobiledevice.la
36 36
37imobiledevice.c: imobiledevice.pyx $(PXDINCLUDES) $(PXIINCLUDES) 37imobiledevice.c: imobiledevice.pyx $(PXDINCLUDES) $(PXIINCLUDES)
38 38
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":
66 afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, char *target, char *linkname) 66 afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, char *target, char *linkname)
67 afc_error_t afc_set_file_time(afc_client_t client, char *path, uint64_t mtime) 67 afc_error_t afc_set_file_time(afc_client_t client, char *path, uint64_t mtime)
68 68
69cdef extern from *:
70 void free(void *ptr)
71
72cdef class AfcError(BaseError): 69cdef class AfcError(BaseError):
73 def __init__(self, *args, **kwargs): 70 def __init__(self, *args, **kwargs):
74 self._lookup_table = { 71 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":
54 54
55cdef class LockdownClient(Base): 55cdef class LockdownClient(Base):
56 cdef lockdownd_client_t _c_client 56 cdef lockdownd_client_t _c_client
57 cpdef int start_service(self, service) 57 cpdef int start_service(self, bytes service)
58 cpdef goodbye(self) 58 cpdef goodbye(self)
59
60cpdef set_debug_level(int level)
61cpdef event_subscribe(object callback)
62cpdef event_unsubscribe()
63cpdef 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):
67 } 67 }
68 BaseError.__init__(self, *args, **kwargs) 68 BaseError.__init__(self, *args, **kwargs)
69 69
70cpdef set_debug_level(int level): 70def set_debug_level(int level):
71 idevice_set_debug_level(level) 71 idevice_set_debug_level(level)
72 72
73cdef class iDeviceEvent: 73cdef class iDeviceEvent:
74 def __init__(self, *args, **kwargs): 74 def __init__(self, *args, **kwargs):
75 raise TypeError("iDeviceEvent cannot be instantiated") 75 raise TypeError("iDeviceEvent cannot be instantiated")
76 76
77cdef void idevice_event_cb(const_idevice_event_t c_event, void *user_data): 77 def __str__(self):
78 return 'iDeviceEvent: %s (%s)' % (self.event == IDEVICE_DEVICE_ADD and 'Add' or 'Remove', self.uuid)
79
80 property event:
81 def __get__(self):
82 return self._c_event.event
83 property uuid:
84 def __get__(self):
85 return self._c_event.uuid
86 property conn_type:
87 def __get__(self):
88 return self._c_event.conn_type
89
90cdef void idevice_event_cb(const_idevice_event_t c_event, void *user_data) with gil:
78 cdef iDeviceEvent event = iDeviceEvent.__new__(iDeviceEvent) 91 cdef iDeviceEvent event = iDeviceEvent.__new__(iDeviceEvent)
79 event._c_event = c_event 92 event._c_event = c_event
80 (<object>user_data)(event) 93 (<object>user_data)(event)
81 94
82cpdef event_subscribe(object callback): 95def event_subscribe(object callback):
83 cdef iDeviceError err = iDeviceError(idevice_event_subscribe(idevice_event_cb, <void*>callback)) 96 cdef iDeviceError err = iDeviceError(idevice_event_subscribe(idevice_event_cb, <void*>callback))
84 if err: raise err 97 if err: raise err
85 98
86cpdef event_unsubscribe(): 99def event_unsubscribe():
87 cdef iDeviceError err = iDeviceError(idevice_event_unsubscribe()) 100 cdef iDeviceError err = iDeviceError(idevice_event_unsubscribe())
88 if err: raise err 101 if err: raise err
89 102
90cpdef get_device_list(): 103def get_device_list():
91 cdef: 104 cdef:
92 char** devices 105 char** devices
93 int count 106 int count
@@ -214,10 +227,14 @@ cdef class LockdownError(BaseError):
214 BaseError.__init__(self, *args, **kwargs) 227 BaseError.__init__(self, *args, **kwargs)
215 228
216cdef class LockdownClient(Base): 229cdef class LockdownClient(Base):
217 def __cinit__(self, iDevice device not None, char *label=NULL, *args, **kwargs): 230 def __cinit__(self, iDevice device not None, bytes label="", *args, **kwargs):
218 cdef: 231 cdef:
219 iDevice dev = device 232 iDevice dev = device
220 lockdownd_error_t err = lockdownd_client_new_with_handshake(dev._c_dev, &(self._c_client), label) 233 lockdownd_error_t err
234 char* c_label = NULL
235 if label:
236 c_label = label
237 err = lockdownd_client_new_with_handshake(dev._c_dev, &(self._c_client), c_label)
221 self.handle_error(err) 238 self.handle_error(err)
222 239
223 def __dealloc__(self): 240 def __dealloc__(self):
@@ -229,7 +246,7 @@ cdef class LockdownClient(Base):
229 cdef inline BaseError _error(self, int16_t ret): 246 cdef inline BaseError _error(self, int16_t ret):
230 return LockdownError(ret) 247 return LockdownError(ret)
231 248
232 cpdef int start_service(self, service): 249 cpdef int start_service(self, bytes service):
233 cdef: 250 cdef:
234 uint16_t port 251 uint16_t port
235 lockdownd_error_t err 252 lockdownd_error_t err
@@ -242,6 +259,8 @@ cdef class LockdownClient(Base):
242 259
243cdef extern from *: 260cdef extern from *:
244 ctypedef char* const_char_ptr "const char*" 261 ctypedef char* const_char_ptr "const char*"
262 void free(void *ptr)
263 void plist_free(plist.plist_t node)
245 264
246include "property_list_client.pxi" 265include "property_list_client.pxi"
247include "mobilesync.pxi" 266include "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":
26 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) 26 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)
27 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) 27 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)
28 28
29cdef void instproxy_notify_cb(const_char_ptr operation, plist.plist_t status, void *py_callback): 29cdef void instproxy_notify_cb(const_char_ptr operation, plist.plist_t status, void *py_callback) with gil:
30 (<object>py_callback)(operation, plist.plist_t_to_node(status, False)) 30 (<object>py_callback)(operation, plist.plist_t_to_node(status, False))
31 31
32cdef class InstallationProxyError(BaseError): 32cdef 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):
4 self.handle_error(self._send(n._c_node)) 4 self.handle_error(self._send(n._c_node))
5 5
6 cpdef object receive(self): 6 cpdef object receive(self):
7 cdef plist.plist_t c_node = NULL 7 cdef:
8 self.handle_error(self._receive(&c_node)) 8 plist.plist_t c_node = NULL
9 int16_t err
10 err = self._receive(&c_node)
11 try:
12 self.handle_error(err)
13 except BaseError, e:
14 if c_node != NULL:
15 plist_free(c_node)
16 raise
9 17
10 return plist.plist_t_to_node(c_node) 18 return plist.plist_t_to_node(c_node)
11 19
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):
29 cdef sbservices_client_t _c_client 29 cdef sbservices_client_t _c_client
30 30
31 def __cinit__(self, iDevice device not None, LockdownClient lockdown=None, *args, **kwargs): 31 def __cinit__(self, iDevice device not None, LockdownClient lockdown=None, *args, **kwargs):
32 cdef iDevice dev = device 32 cdef:
33 cdef LockdownClient lckd 33 iDevice dev = device
34 LockdownClient lckd
34 if lockdown is None: 35 if lockdown is None:
35 lckd = LockdownClient(dev) 36 lckd = LockdownClient(dev)
36 else: 37 else:
37 lckd = lockdown 38 lckd = lockdown
38 port = lockdown.start_service("com.apple.springboardservices") 39 port = lckd.start_service("com.apple.springboardservices")
39 self.handle_error(sbservices_client_new(dev._c_dev, port, &(self._c_client))) 40 err = SpringboardServicesError(sbservices_client_new(dev._c_dev, port, &(self._c_client)))
41 if err: raise err
40 42
41 def __dealloc__(self): 43 def __dealloc__(self):
42 if self._c_client is not NULL: 44 if self._c_client is not NULL:
@@ -51,7 +53,14 @@ cdef class SpringboardServicesClient(Base):
51 cdef: 53 cdef:
52 plist.plist_t c_node = NULL 54 plist.plist_t c_node = NULL
53 plist.Node node 55 plist.Node node
54 self.handle_error(sbservices_get_icon_state(self._c_client, &c_node)) 56 sbservices_error_t err
57 err = sbservices_get_icon_state(self._c_client, &c_node)
58 try:
59 self.handle_error(err)
60 except BaseError, e:
61 if c_node != NULL:
62 plist_free(c_node)
63 raise
55 node = plist.plist_t_to_node(c_node) 64 node = plist.plist_t_to_node(c_node)
56 return node 65 return node
57 def __set__(self, plist.Node newstate not None): 66 def __set__(self, plist.Node newstate not None):
@@ -63,6 +72,13 @@ cdef class SpringboardServicesClient(Base):
63 bytes result 72 bytes result
64 char* pngdata = NULL 73 char* pngdata = NULL
65 uint64_t pngsize 74 uint64_t pngsize
66 self.handle_error(sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize)) 75 sbservices_error_t err
67 result = pngdata[:pngsize] 76 err = sbservices_get_icon_pngdata(self._c_client, bundleId, &pngdata, &pngsize)
77 try:
78 self.handle_error(err)
79 except BaseError, e:
80 raise
81 finally:
82 result = pngdata[:pngsize]
83 free(pngdata)
68 return result 84 return result