diff --git a/CHANGELOG.md b/CHANGELOG.md index 62229ee3a..341806823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ## Unreleased ### API-Changes +- breaking change: replace `dc_accounts_event_emitter_t` with `dc_event_emitter_t` #3422 + + Type `dc_accounts_event_emitter_t` is removed. + `dc_accounts_get_event_emitter()` returns `dc_event_emitter_t` now, so + `dc_get_next_event()` should be used instead of `dc_accounts_get_next_event` + and `dc_event_emitter_unref()` should be used instead of + `dc_accounts_event_emitter_unref`. - add `dc_contact_was_seen_recently()` #3560 ### Changes diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 303373e70..8af433a73 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -22,7 +22,6 @@ typedef struct _dc_lot dc_lot_t; typedef struct _dc_provider dc_provider_t; typedef struct _dc_event dc_event_t; typedef struct _dc_event_emitter dc_event_emitter_t; -typedef struct _dc_accounts_event_emitter dc_accounts_event_emitter_t; typedef struct _dc_jsonrpc_instance dc_jsonrpc_instance_t; /** @@ -2844,13 +2843,13 @@ void dc_accounts_maybe_network_lost (dc_accounts_t* accounts); * @memberof dc_accounts_t * @param accounts The account manager as created by dc_accounts_new(). * @return Returns the event emitter, NULL on errors. - * Must be freed using dc_accounts_event_emitter_unref() after usage. + * Must be freed using dc_event_emitter_unref() after usage. * * Note: Use only one event emitter per account manager. * Having more than one event emitter running at the same time on the same account manager * will result in events randomly delivered to the one or to the other. */ -dc_accounts_event_emitter_t* dc_accounts_get_event_emitter (dc_accounts_t* accounts); +dc_event_emitter_t* dc_accounts_get_event_emitter (dc_accounts_t* accounts); /** @@ -5261,9 +5260,8 @@ char* dc_jsonrpc_next_response(dc_jsonrpc_instance_t* jsonrpc_instance); * @class dc_event_emitter_t * * Opaque object that is used to get events from a single context. - * You can get an event emitter from a context using dc_get_event_emitter(). - * If you are using the dc_accounts_t account manager, - * dc_accounts_event_emitter_t must be used instead. + * You can get an event emitter from a context using dc_get_event_emitter() + * or dc_accounts_get_event_emitter(). */ /** @@ -5290,39 +5288,6 @@ dc_event_t* dc_get_next_event(dc_event_emitter_t* emitter); void dc_event_emitter_unref(dc_event_emitter_t* emitter); -/** - * @class dc_accounts_event_emitter_t - * - * Opaque object that is used to get events from the dc_accounts_t account manager. - * You get an event emitter from the account manager using dc_accounts_get_event_emitter(). - * If you are not using the dc_accounts_t account manager but just a single dc_context_t object, - * dc_event_emitter_t must be used instead. - */ - -/** - * Get the next event from an accounts event emitter object. - * - * @memberof dc_accounts_event_emitter_t - * @param emitter Event emitter object as returned from dc_accounts_get_event_emitter(). - * @return An event as an dc_event_t object. - * You can query the event for information using dc_event_get_id(), dc_event_get_data1_int() and so on; - * if you are done with the event, you have to free the event using dc_event_unref(). - * If NULL is returned, the contexts belonging to the event emitter are unref'd and no more events will come; - * in this case, free the event emitter using dc_accounts_event_emitter_unref(). - */ -dc_event_t* dc_accounts_get_next_event (dc_accounts_event_emitter_t* emitter); - - -/** - * Free an accounts event emitter object. - * - * @memberof dc_accounts_event_emitter_t - * @param emitter Event emitter object as returned from dc_accounts_get_event_emitter(). - * If NULL is given, nothing is done and an error is logged. - */ -void dc_accounts_event_emitter_unref(dc_accounts_event_emitter_t* emitter); - - /** * @class dc_event_t * @@ -5393,7 +5358,7 @@ char* dc_event_get_data2_str(dc_event_t* event); * To get the context object belonging to the event, use dc_accounts_get_account(). * * @memberof dc_event_t - * @param event The event object as returned from dc_accounts_get_next_event(). + * @param event The event object as returned from dc_get_next_event(). * @return The account ID belonging to the event, 0 for account manager errors. */ uint32_t dc_event_get_account_id(dc_event_t* event); diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 017c3817f..e85d93957 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -4416,12 +4416,10 @@ pub unsafe extern "C" fn dc_accounts_maybe_network_lost(accounts: *mut dc_accoun block_on(async move { accounts.write().await.maybe_network_lost().await }); } -pub type dc_accounts_event_emitter_t = EventEmitter; - #[no_mangle] pub unsafe extern "C" fn dc_accounts_get_event_emitter( accounts: *mut dc_accounts_t, -) -> *mut dc_accounts_event_emitter_t { +) -> *mut dc_event_emitter_t { if accounts.is_null() { eprintln!("ignoring careless call to dc_accounts_get_event_emitter()"); return ptr::null_mut(); @@ -4433,31 +4431,6 @@ pub unsafe extern "C" fn dc_accounts_get_event_emitter( Box::into_raw(Box::new(emitter)) } -#[no_mangle] -pub unsafe extern "C" fn dc_accounts_event_emitter_unref( - emitter: *mut dc_accounts_event_emitter_t, -) { - if emitter.is_null() { - eprintln!("ignoring careless call to dc_accounts_event_emitter_unref()"); - return; - } - let _ = Box::from_raw(emitter); -} - -#[no_mangle] -pub unsafe extern "C" fn dc_accounts_get_next_event( - emitter: *mut dc_accounts_event_emitter_t, -) -> *mut dc_event_t { - if emitter.is_null() { - eprintln!("ignoring careless call to dc_accounts_get_next_event()"); - return ptr::null_mut(); - } - let emitter = &mut *emitter; - block_on(emitter.recv()) - .map(|ev| Box::into_raw(Box::new(ev))) - .unwrap_or_else(ptr::null_mut) -} - #[cfg(feature = "jsonrpc")] mod jsonrpc { use super::*; diff --git a/node/src/module.c b/node/src/module.c index 0e0369e02..3d3045017 100644 --- a/node/src/module.c +++ b/node/src/module.c @@ -3112,14 +3112,14 @@ static void accounts_event_handler_thread_func(void* arg) TRACE("event_handler_thread_func starting"); - dc_accounts_event_emitter_t * dc_accounts_event_emitter = dc_accounts_get_event_emitter(dcn_accounts->dc_accounts); + dc_event_emitter_t * dc_event_emitter = dc_accounts_get_event_emitter(dcn_accounts->dc_accounts); dc_event_t* event; while (true) { - if (dc_accounts_event_emitter == NULL) { + if (dc_event_emitter == NULL) { TRACE("event emitter is null, bailing"); break; } - event = dc_accounts_get_next_event(dc_accounts_event_emitter); + event = dc_get_next_event(dc_event_emitter); if (event == NULL) { TRACE("no more events"); break; @@ -3145,7 +3145,7 @@ static void accounts_event_handler_thread_func(void* arg) } } - dc_accounts_event_emitter_unref(dc_accounts_event_emitter); + dc_event_emitter_unref(dc_event_emitter); TRACE("event_handler_thread_func ended");