public static void RegisterCallResult(ICallResultBase callback, SteamAPICall_t hAPICall) { List <ICallResultBase> callResultList; if (m_RegisteredCallResults.TryGetValue(hAPICall, out callResultList)) { callResultList.Add(callback); } else { callResultList = new List <ICallResultBase>(); callResultList.Add(callback); m_RegisteredCallResults.Add(hAPICall, callResultList); } }
public static void UnregisterCallResult(ICallResultBase callback, SteamAPICall_t hAPICall) { List <ICallResultBase> callResultList; if (m_RegisteredCallResults.TryGetValue(hAPICall, out callResultList)) { foreach (ICallResultBase c in callResultList) { if (c == callback) { callResultList.Remove(c); break; } } if (callResultList.Count == 0) { m_RegisteredCallResults.Remove(hAPICall); } } }
public static void RunCallResult(SteamAPICallCompleted_t apicall) { List <ICallResultBase> callResultList; if (!m_RegisteredCallResults.TryGetValue(apicall.m_hAsyncCall, out callResultList)) { return; } if (callResultList.Count == 0) { // This should never ever happen? Jankyness. m_RegisteredCallResults.Remove(apicall.m_hAsyncCall); return; } IntPtr pData = IntPtr.Zero; bool bFailed; try { ICallResultBase apiCallback = callResultList[0]; pData = Marshal.AllocHGlobal(apiCallback.GetCallbackSizeBytes()); if (!NativeMethods.Steam_GetAPICallResult(m_LastActivePipe, apicall.m_hAsyncCall, pData, apiCallback.GetCallbackSizeBytes(), apiCallback.GetICallback(), out bFailed)) { return; } foreach (ICallResultBase c in callResultList) { c.Run(pData, bFailed); } } finally { // Unregister all m_RegisteredCallResults.Remove(apicall.m_hAsyncCall); Marshal.FreeHGlobal(pData); } }