|
1
|
1 #include "foobar2000-sdk-pch.h"
|
|
|
2 #include "completion_notify.h"
|
|
|
3 #include "main_thread_callback.h"
|
|
|
4
|
|
|
5 void completion_notify::g_signal_completion_async(completion_notify_ptr p_notify,unsigned p_code) {
|
|
|
6 if (p_notify.is_valid()) {
|
|
|
7 fb2k::inMainThread([p_notify, p_code] { p_notify->on_completion(p_code); });
|
|
|
8 }
|
|
|
9 }
|
|
|
10
|
|
|
11 void completion_notify::on_completion_async(unsigned p_code) {
|
|
|
12 g_signal_completion_async(this, p_code);
|
|
|
13 }
|
|
|
14
|
|
|
15
|
|
|
16 completion_notify::ptr completion_notify_receiver::create_or_get_task(unsigned p_id) {
|
|
|
17 completion_notify_orphanable_ptr ptr;
|
|
|
18 if (!m_tasks.query(p_id,ptr)) {
|
|
|
19 ptr = completion_notify_create(this,p_id);
|
|
|
20 m_tasks.set(p_id,ptr);
|
|
|
21 }
|
|
|
22 return ptr;
|
|
|
23 }
|
|
|
24
|
|
|
25 completion_notify_ptr completion_notify_receiver::create_task(unsigned p_id) {
|
|
|
26 completion_notify_orphanable_ptr ptr;
|
|
|
27 if (m_tasks.query(p_id,ptr)) ptr->orphan();
|
|
|
28 ptr = completion_notify_create(this,p_id);
|
|
|
29 m_tasks.set(p_id,ptr);
|
|
|
30 return ptr;
|
|
|
31 }
|
|
|
32
|
|
|
33 bool completion_notify_receiver::have_task(unsigned p_id) const {
|
|
|
34 return m_tasks.have_item(p_id);
|
|
|
35 }
|
|
|
36
|
|
|
37 void completion_notify_receiver::orphan_task(unsigned p_id) {
|
|
|
38 completion_notify_orphanable_ptr ptr;
|
|
|
39 if (m_tasks.query(p_id,ptr)) {
|
|
|
40 ptr->orphan();
|
|
|
41 m_tasks.remove(p_id);
|
|
|
42 }
|
|
|
43 }
|
|
|
44
|
|
|
45 completion_notify_receiver::~completion_notify_receiver() {
|
|
|
46 orphan_all_tasks();
|
|
|
47 }
|
|
|
48
|
|
|
49 void completion_notify_receiver::orphan_all_tasks() {
|
|
|
50 m_tasks.enumerate(orphanfunc);
|
|
|
51 m_tasks.remove_all();
|
|
|
52 }
|
|
|
53
|
|
|
54 namespace {
|
|
|
55 using namespace fb2k;
|
|
|
56
|
|
|
57 class completion_notify_func : public completion_notify {
|
|
|
58 public:
|
|
|
59 void on_completion(unsigned p_code) noexcept override {
|
|
|
60 m_func(p_code);
|
|
|
61 }
|
|
|
62
|
|
|
63 completionNotifyFunc_t m_func;
|
|
|
64 };
|
|
|
65 }
|
|
|
66
|
|
|
67 namespace fb2k {
|
|
|
68
|
|
|
69 completion_notify::ptr makeCompletionNotify( completionNotifyFunc_t func ) {
|
|
|
70 auto n = fb2k::service_new< completion_notify_func >();
|
|
|
71 n->m_func = func;
|
|
|
72 return n;
|
|
|
73 }
|
|
|
74
|
|
|
75 }
|