Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/SDK/completion_notify.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/completion_notify.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,75 @@ +#include "foobar2000-sdk-pch.h" +#include "completion_notify.h" +#include "main_thread_callback.h" + +void completion_notify::g_signal_completion_async(completion_notify_ptr p_notify,unsigned p_code) { + if (p_notify.is_valid()) { + fb2k::inMainThread([p_notify, p_code] { p_notify->on_completion(p_code); }); + } +} + +void completion_notify::on_completion_async(unsigned p_code) { + g_signal_completion_async(this, p_code); +} + + +completion_notify::ptr completion_notify_receiver::create_or_get_task(unsigned p_id) { + completion_notify_orphanable_ptr ptr; + if (!m_tasks.query(p_id,ptr)) { + ptr = completion_notify_create(this,p_id); + m_tasks.set(p_id,ptr); + } + return ptr; +} + +completion_notify_ptr completion_notify_receiver::create_task(unsigned p_id) { + completion_notify_orphanable_ptr ptr; + if (m_tasks.query(p_id,ptr)) ptr->orphan(); + ptr = completion_notify_create(this,p_id); + m_tasks.set(p_id,ptr); + return ptr; +} + +bool completion_notify_receiver::have_task(unsigned p_id) const { + return m_tasks.have_item(p_id); +} + +void completion_notify_receiver::orphan_task(unsigned p_id) { + completion_notify_orphanable_ptr ptr; + if (m_tasks.query(p_id,ptr)) { + ptr->orphan(); + m_tasks.remove(p_id); + } +} + +completion_notify_receiver::~completion_notify_receiver() { + orphan_all_tasks(); +} + +void completion_notify_receiver::orphan_all_tasks() { + m_tasks.enumerate(orphanfunc); + m_tasks.remove_all(); +} + +namespace { + using namespace fb2k; + + class completion_notify_func : public completion_notify { + public: + void on_completion(unsigned p_code) noexcept override { + m_func(p_code); + } + + completionNotifyFunc_t m_func; + }; +} + +namespace fb2k { + + completion_notify::ptr makeCompletionNotify( completionNotifyFunc_t func ) { + auto n = fb2k::service_new< completion_notify_func >(); + n->m_func = func; + return n; + } + +}
