aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/syscb/cbmgr.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/syscb/cbmgr.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/syscb/cbmgr.cpp')
-rw-r--r--Src/Wasabi/api/syscb/cbmgr.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/Src/Wasabi/api/syscb/cbmgr.cpp b/Src/Wasabi/api/syscb/cbmgr.cpp
new file mode 100644
index 00000000..93633693
--- /dev/null
+++ b/Src/Wasabi/api/syscb/cbmgr.cpp
@@ -0,0 +1,41 @@
+#include <precomp.h>
+#ifndef NOCBMGR
+#include "cbmgr.h"
+#include <api/syscb/callbacks/syscb.h>
+
+#include <bfc/multimap.h>
+
+static MultiMap<int, SysCallback> cblist;
+static PtrList<SysCallback> delete_list;
+static int reentry_counter=0;
+
+void CallbackManager::registerCallback(SysCallback *cb, void *param, WaComponent *owner) {
+ cblist.multiAddItem(cb->getEventType(), cb, TRUE);
+}
+
+void CallbackManager::deregisterCallback(SysCallback *cb, WaComponent *owner) {
+ delete_list.addItem(cb);
+ cblist.multiDelItem(cb->getEventType(), cb); // remove ref
+}
+
+void CallbackManager::issueCallback(int eventtype, int msg, int param1, int param2) {
+ ASSERT(reentry_counter >= 0);
+ reentry_counter++;
+ const PtrList<SysCallback> *mlist = cblist.getListForIndex(eventtype);
+ if (mlist != NULL) {
+ foreach(mlist)
+ SysCallback *cb = mlist->getfor();
+ ASSERT(cb != NULL);
+ if (!delete_list.haveItem(cb))
+ cb->notify(msg, param1, param2);
+ endfor
+ }
+ reentry_counter--;
+ if (reentry_counter == 0)
+ delete_list.removeAll();
+}
+
+int CallbackManager::getNumCallbacks() {
+ return cblist.getNumItems();
+}
+#endif \ No newline at end of file