summaryrefslogtreecommitdiffstats
path: root/cython/restore.pxi
diff options
context:
space:
mode:
authorGravatar Martin Szulecki2013-02-27 15:14:01 +0100
committerGravatar Martin Szulecki2013-02-27 15:14:01 +0100
commitc19978863878a014b5aa2538989b41b864708866 (patch)
tree73d40d6cbda5250972239c96b418edeb6fbbbf52 /cython/restore.pxi
parent0cac547eb79492e04176ad541fe6fb1d1f576824 (diff)
downloadlibimobiledevice-c19978863878a014b5aa2538989b41b864708866.tar.gz
libimobiledevice-c19978863878a014b5aa2538989b41b864708866.tar.bz2
cython: Add all service protocols which brings Python bindings to 100% coverage
Diffstat (limited to 'cython/restore.pxi')
-rw-r--r--cython/restore.pxi135
1 files changed, 135 insertions, 0 deletions
diff --git a/cython/restore.pxi b/cython/restore.pxi
new file mode 100644
index 0000000..7d3d80e
--- /dev/null
+++ b/cython/restore.pxi
@@ -0,0 +1,135 @@
1cdef extern from "libimobiledevice/restore.h":
2 cdef struct restored_client_private:
3 pass
4 ctypedef restored_client_private *restored_client_t
5
6 ctypedef enum restored_error_t:
7 RESTORE_E_SUCCESS = 0
8 RESTORE_E_INVALID_ARG = -1
9 RESTORE_E_INVALID_CONF = -2
10 RESTORE_E_PLIST_ERROR = -3
11 RESTORE_E_DICT_ERROR = -4
12 RESTORE_E_NOT_ENOUGH_DATA = -5
13 RESTORE_E_MUX_ERROR = -6
14 RESTORE_E_START_RESTORE_FAILED = -7
15 RESTORE_E_UNKNOWN_ERROR = -256
16
17 restored_error_t restored_client_new(idevice_t device, restored_client_t *client, char *label)
18 restored_error_t restored_client_free(restored_client_t client)
19
20 restored_error_t restored_query_type(restored_client_t client, char **tp, uint64_t *version)
21 restored_error_t restored_query_value(restored_client_t client, char *key, plist.plist_t *value)
22 restored_error_t restored_get_value(restored_client_t client, char *key, plist.plist_t *value)
23 restored_error_t restored_send(restored_client_t client, plist.plist_t plist)
24 restored_error_t restored_receive(restored_client_t client, plist.plist_t *plist)
25 restored_error_t restored_goodbye(restored_client_t client)
26
27 restored_error_t restored_start_restore(restored_client_t client, plist.plist_t options, uint64_t version)
28 restored_error_t restored_reboot(restored_client_t client)
29
30 void restored_client_set_label(restored_client_t client, char *label)
31
32cdef class RestoreError(BaseError):
33 def __init__(self, *args, **kwargs):
34 self._lookup_table = {
35 RESTORE_E_SUCCESS: "Success",
36 RESTORE_E_INVALID_ARG: "Invalid argument",
37 RESTORE_E_INVALID_CONF: "Invalid configuration",
38 RESTORE_E_PLIST_ERROR: "Property list error",
39 RESTORE_E_DICT_ERROR: "Dict error",
40 RESTORE_E_NOT_ENOUGH_DATA: "Not enough data",
41 RESTORE_E_MUX_ERROR: "MUX Error",
42 RESTORE_E_START_RESTORE_FAILED: "Starting restore failed",
43 RESTORE_E_UNKNOWN_ERROR: "Unknown error"
44 }
45 BaseError.__init__(self, *args, **kwargs)
46
47cdef class RestoreClient(PropertyListService):
48 cdef restored_client_t _c_client
49
50 def __cinit__(self, iDevice device not None, bytes label=b'', *args, **kwargs):
51 cdef:
52 restored_error_t err
53 char* c_label = NULL
54 if label:
55 c_label = label
56 err = restored_client_new(device._c_dev, &self._c_client, c_label)
57 self.handle_error(err)
58
59 self.device = device
60
61 def __dealloc__(self):
62 cdef restored_error_t err
63 if self._c_client is not NULL:
64 err = restored_client_free(self._c_client)
65 self.handle_error(err)
66
67 cdef inline BaseError _error(self, int16_t ret):
68 return RestoreError(ret)
69
70 cdef inline int16_t _send(self, plist.plist_t node):
71 return restored_send(self._c_client, node)
72
73 cdef inline int16_t _receive(self, plist.plist_t* node):
74 return restored_receive(self._c_client, node)
75
76 cpdef tuple query_type(self):
77 cdef:
78 restored_error_t err
79 char* c_type = NULL
80 uint64_t c_version = 0
81 tuple result
82 err = restored_query_type(self._c_client, &c_type, &c_version)
83 try:
84 self.handle_error(err)
85 result = (c_type, c_version)
86 return result
87 except BaseError, e:
88 raise
89 finally:
90 if c_type != NULL:
91 free(c_type)
92
93 cpdef plist.Node query_value(self, bytes key=None):
94 cdef:
95 restored_error_t err
96 plist.plist_t c_node = NULL
97 char* c_key = NULL
98 if key is not None:
99 c_key = key
100 err = restored_query_value(self._c_client, c_key, &c_node)
101 try:
102 self.handle_error(err)
103 return plist.plist_t_to_node(c_node)
104 except BaseError, e:
105 if c_node != NULL:
106 plist.plist_free(c_node)
107 raise
108
109 cpdef plist.Node get_value(self, bytes key=None):
110 cdef:
111 restored_error_t err
112 plist.plist_t c_node = NULL
113 char* c_key = NULL
114 if key is not None:
115 c_key = key
116 err = restored_get_value(self._c_client, c_key, &c_node)
117 try:
118 self.handle_error(err)
119 return plist.plist_t_to_node(c_node)
120 except BaseError, e:
121 if c_node != NULL:
122 plist.plist_free(c_node)
123 raise
124
125 cpdef goodbye(self):
126 self.handle_error(restored_goodbye(self._c_client))
127
128 cpdef start_restore(self, plist.Node options, uint64_t version):
129 self.handle_error(restored_start_restore(self._c_client, options._c_node, version))
130
131 cpdef reboot(self):
132 self.handle_error(restored_reboot(self._c_client))
133
134 cpdef set_label(self, bytes label):
135 restored_client_set_label(self._c_client, label)