From 41f7119d8631a142fa5a97285a8443f9d7eb7e14 Mon Sep 17 00:00:00 2001 From: manuel Date: Sat, 9 Mar 2013 15:14:01 +0100 Subject: initial import of UpdateTool 0.4 --- CallbackDispatcher.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 CallbackDispatcher.cpp (limited to 'CallbackDispatcher.cpp') diff --git a/CallbackDispatcher.cpp b/CallbackDispatcher.cpp new file mode 100644 index 0000000..12b4906 --- /dev/null +++ b/CallbackDispatcher.cpp @@ -0,0 +1,66 @@ +/* + This file is a part of "Didrole's Update Tool" + ©2k12, Didrole + + License : Public domain +*/ + +#include "../../Open Steamworks/Steamworks.h" +#include + +extern HSteamPipe g_hPipe; + + +std::multimap g_callbacksMap; + +class Callback : public CCallbackBase +{ +public: + void AddRegisteredFlag() + { + m_nCallbackFlags |= k_ECallbackFlagsRegistered; + } +}; + +void STEAM_CALL SteamAPI_RegisterCallback( class CCallbackBase *pCallback, int iCallback ) +{ + ((Callback*)pCallback)->AddRegisteredFlag(); + g_callbacksMap.insert(std::pair(iCallback, pCallback)); +} + +void STEAM_CALL SteamAPI_UnregisterCallback( class CCallbackBase *pCallback ) +{ + for(std::multimap::iterator i = g_callbacksMap.begin(); i != g_callbacksMap.end();) + { + if(i->second == pCallback) + { + g_callbacksMap.erase(i++); + } + else + i++; + } +} + +void STEAM_CALL SteamAPI_RunCallbacks() +{ + CallbackMsg_t callbackMsg; + while(Steam_BGetCallback(g_hPipe, &callbackMsg)) + { + // We are making a copy of the data to be able to call Steam_FreeLastCallback before sending the data to the callback handlers + // That will allow recursive calls to this function to work properly (ie: no infinite processing of the same callback) + + unsigned char* pubData = new unsigned char[callbackMsg.m_cubParam]; + memcpy(pubData, callbackMsg.m_pubParam, callbackMsg.m_cubParam); + + Steam_FreeLastCallback(g_hPipe); + + std::pair::iterator, std::multimap::iterator> range = g_callbacksMap.equal_range(callbackMsg.m_iCallback); + + for(std::multimap::const_iterator i = range.first; i != range.second; ++i) + { + i->second->Run(pubData); + } + + delete[] pubData; + } +} -- cgit v1.2.3