summaryrefslogtreecommitdiffstats
path: root/src/idevice.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/idevice.c')
-rw-r--r--src/idevice.c59
1 files changed, 49 insertions, 10 deletions
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;