summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libimobiledevice/libimobiledevice.h36
-rw-r--r--src/idevice.c59
-rw-r--r--tools/idevicebtlogger.c5
-rw-r--r--tools/idevicesyslog.c5
4 files changed, 89 insertions, 16 deletions
diff --git a/include/libimobiledevice/libimobiledevice.h b/include/libimobiledevice/libimobiledevice.h
index c3b87cd..6851145 100644
--- a/include/libimobiledevice/libimobiledevice.h
+++ b/include/libimobiledevice/libimobiledevice.h
@@ -94,6 +94,9 @@ typedef struct {
94/** Callback to notifiy if a device was added or removed. */ 94/** Callback to notifiy if a device was added or removed. */
95typedef void (*idevice_event_cb_t) (const idevice_event_t *event, void *user_data); 95typedef void (*idevice_event_cb_t) (const idevice_event_t *event, void *user_data);
96 96
97/** Event subscription context type */
98typedef struct idevice_subscription_context* idevice_subscription_context_t;
99
97/* functions */ 100/* functions */
98 101
99/** 102/**
@@ -104,9 +107,36 @@ typedef void (*idevice_event_cb_t) (const idevice_event_t *event, void *user_dat
104void idevice_set_debug_level(int level); 107void idevice_set_debug_level(int level);
105 108
106/** 109/**
107 * Register a callback function that will be called when device add/remove 110 * Subscribe a callback function that will be called when device add/remove
108 * events occur. 111 * events occur.
109 * 112 *
113 * @param context A pointer to a idevice_subscription_context_t that will be
114 * set upon creation of the subscription. The returned context must be
115 * passed to idevice_events_unsubscribe() to unsubscribe the callback.
116 * @param callback Callback function to call.
117 * @param user_data Application-specific data passed as parameter
118 * to the registered callback function.
119 *
120 * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
121 */
122idevice_error_t idevice_events_subscribe(idevice_subscription_context_t *context, idevice_event_cb_t callback, void *user_data);
123
124/**
125 * Unsubscribe the event callback function that has been registered with
126 * idevice_events_subscribe().
127 *
128 * @param context A valid context as returned from idevice_events_subscribe().
129 *
130 * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
131 */
132idevice_error_t idevice_events_unsubscribe(idevice_subscription_context_t context);
133
134/**
135 * (DEPRECATED) Register a callback function that will be called when device add/remove
136 * events occur.
137 *
138 * @deprecated Use idevice_events_subscribe() instead.
139 *
110 * @param callback Callback function to call. 140 * @param callback Callback function to call.
111 * @param user_data Application-specific data passed as parameter 141 * @param user_data Application-specific data passed as parameter
112 * to the registered callback function. 142 * to the registered callback function.
@@ -116,9 +146,11 @@ void idevice_set_debug_level(int level);
116idevice_error_t idevice_event_subscribe(idevice_event_cb_t callback, void *user_data); 146idevice_error_t idevice_event_subscribe(idevice_event_cb_t callback, void *user_data);
117 147
118/** 148/**
119 * Release the event callback function that has been registered with 149 * (DEPRECATED) Release the event callback function that has been registered with
120 * idevice_event_subscribe(). 150 * idevice_event_subscribe().
121 * 151 *
152 * @deprecated Use idevice_events_unsubscribe() instead.
153 *
122 * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred. 154 * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
123 */ 155 */
124idevice_error_t idevice_event_unsubscribe(void); 156idevice_error_t idevice_event_unsubscribe(void);
diff --git a/src/idevice.c b/src/idevice.c
index 22d57e3..c8574fc 100644
--- a/src/idevice.c
+++ b/src/idevice.c
@@ -215,10 +215,17 @@ BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
215#warning No compiler support for constructor/destructor attributes, some features might not be available. 215#warning No compiler support for constructor/destructor attributes, some features might not be available.
216#endif 216#endif
217 217
218static idevice_event_cb_t event_cb = NULL; 218struct idevice_subscription_context {
219 idevice_event_cb_t callback;
220 void *user_data;
221 usbmuxd_subscription_context_t ctx;
222};
223
224static idevice_subscription_context_t event_ctx = NULL;
219 225
220static void usbmux_event_cb(const usbmuxd_event_t *event, void *user_data) 226static void usbmux_event_cb(const usbmuxd_event_t *event, void *user_data)
221{ 227{
228 idevice_subscription_context_t context = (idevice_subscription_context_t)user_data;
222 idevice_event_t ev; 229 idevice_event_t ev;
223 230
224 ev.event = event->event; 231 ev.event = event->event;
@@ -232,34 +239,66 @@ static void usbmux_event_cb(const usbmuxd_event_t *event, void *user_data)
232 debug_info("Unknown connection type %d", event->device.conn_type); 239 debug_info("Unknown connection type %d", event->device.conn_type);
233 } 240 }
234 241
235 if (event_cb) { 242 if (context->callback) {
236 event_cb(&ev, user_data); 243 context->callback(&ev, context->user_data);
237 } 244 }
238} 245}
239 246
240LIBIMOBILEDEVICE_API idevice_error_t idevice_event_subscribe(idevice_event_cb_t callback, void *user_data) 247LIBIMOBILEDEVICE_API idevice_error_t idevice_events_subscribe(idevice_subscription_context_t *context, idevice_event_cb_t callback, void *user_data)
241{ 248{
242 event_cb = callback; 249 if (!context || !callback) {
243 int res = usbmuxd_subscribe(usbmux_event_cb, user_data); 250 return IDEVICE_E_INVALID_ARG;
251 }
252 *context = malloc(sizeof(struct idevice_subscription_context));
253 if (!*context) {
254 debug_info("ERROR: %s: Failed to allocate subscription context\n", __func__);
255 return IDEVICE_E_UNKNOWN_ERROR;
256 }
257 (*context)->callback = callback;
258 (*context)->user_data = user_data;
259 int res = usbmuxd_events_subscribe(&(*context)->ctx, usbmux_event_cb, *context);
244 if (res != 0) { 260 if (res != 0) {
245 event_cb = NULL; 261 free(*context);
262 *context = NULL;
246 debug_info("ERROR: usbmuxd_subscribe() returned %d!", res); 263 debug_info("ERROR: usbmuxd_subscribe() returned %d!", res);
247 return IDEVICE_E_UNKNOWN_ERROR; 264 return IDEVICE_E_UNKNOWN_ERROR;
248 } 265 }
249 return IDEVICE_E_SUCCESS; 266 return IDEVICE_E_SUCCESS;
250} 267}
251 268
252LIBIMOBILEDEVICE_API idevice_error_t idevice_event_unsubscribe(void) 269LIBIMOBILEDEVICE_API idevice_error_t idevice_events_unsubscribe(idevice_subscription_context_t context)
253{ 270{
254 event_cb = NULL; 271 if (!context) {
255 int res = usbmuxd_unsubscribe(); 272 return IDEVICE_E_INVALID_ARG;
273 }
274 int res = usbmuxd_events_unsubscribe(context->ctx);
256 if (res != 0) { 275 if (res != 0) {
257 debug_info("ERROR: usbmuxd_unsubscribe() returned %d!", res); 276 debug_info("ERROR: usbmuxd_unsubscribe() returned %d!", res);
258 return IDEVICE_E_UNKNOWN_ERROR; 277 return IDEVICE_E_UNKNOWN_ERROR;
259 } 278 }
279 if (context == event_ctx) {
280 event_ctx = NULL;
281 }
282 free(context);
260 return IDEVICE_E_SUCCESS; 283 return IDEVICE_E_SUCCESS;
261} 284}
262 285
286LIBIMOBILEDEVICE_API idevice_error_t idevice_event_subscribe(idevice_event_cb_t callback, void *user_data)
287{
288 if (event_ctx) {
289 idevice_events_unsubscribe(event_ctx);
290 }
291 return idevice_events_subscribe(&event_ctx, callback, user_data);
292}
293
294LIBIMOBILEDEVICE_API idevice_error_t idevice_event_unsubscribe(void)
295{
296 if (!event_ctx) {
297 return IDEVICE_E_SUCCESS;
298 }
299 return idevice_events_unsubscribe(event_ctx);
300}
301
263LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list_extended(idevice_info_t **devices, int *count) 302LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list_extended(idevice_info_t **devices, int *count)
264{ 303{
265 usbmuxd_device_info_t *dev_list; 304 usbmuxd_device_info_t *dev_list;
diff --git a/tools/idevicebtlogger.c b/tools/idevicebtlogger.c
index 421ce98..8de6b22 100644
--- a/tools/idevicebtlogger.c
+++ b/tools/idevicebtlogger.c
@@ -440,13 +440,14 @@ int main(int argc, char *argv[])
440 assert(0); 440 assert(0);
441 return -2; 441 return -2;
442 } 442 }
443 idevice_event_subscribe(device_event_cb, NULL); 443 idevice_subscription_context_t context = NULL;
444 idevice_events_subscribe(&context, device_event_cb, NULL);
444 445
445 while (!quit_flag) { 446 while (!quit_flag) {
446 sleep(1); 447 sleep(1);
447 } 448 }
448 449
449 idevice_event_unsubscribe(); 450 idevice_events_unsubscribe(context);
450 stop_logging(); 451 stop_logging();
451 452
452 fclose(packetlogger_file); 453 fclose(packetlogger_file);
diff --git a/tools/idevicesyslog.c b/tools/idevicesyslog.c
index f85c7cc..3084b97 100644
--- a/tools/idevicesyslog.c
+++ b/tools/idevicesyslog.c
@@ -709,12 +709,13 @@ int main(int argc, char *argv[])
709 line_buffer_size = 1024; 709 line_buffer_size = 1024;
710 line = malloc(line_buffer_size); 710 line = malloc(line_buffer_size);
711 711
712 idevice_event_subscribe(device_event_cb, NULL); 712 idevice_subscription_context_t context = NULL;
713 idevice_events_subscribe(&context, device_event_cb, NULL);
713 714
714 while (!quit_flag) { 715 while (!quit_flag) {
715 sleep(1); 716 sleep(1);
716 } 717 }
717 idevice_event_unsubscribe(); 718 idevice_events_unsubscribe(context);
718 stop_logging(); 719 stop_logging();
719 720
720 if (num_proc_filters > 0) { 721 if (num_proc_filters > 0) {