Facebook.Unity/CallbackManager.cs (86 lines of code) (raw):

/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright notice shall be * included in all copies or substantial portions of the software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace Facebook.Unity { using System; using System.Collections.Generic; internal class CallbackManager { private IDictionary<string, object> facebookDelegates = new Dictionary<string, object>(); private int nextAsyncId; public string AddFacebookDelegate<T>(FacebookDelegate<T> callback) where T : IResult { if (callback == null) { return null; } this.nextAsyncId++; this.facebookDelegates.Add(this.nextAsyncId.ToString(), callback); return this.nextAsyncId.ToString(); } public void OnFacebookResponse(IInternalResult result) { if (result == null || result.CallbackId == null) { return; } object callback; if (this.facebookDelegates.TryGetValue(result.CallbackId, out callback)) { CallCallback(callback, result); this.facebookDelegates.Remove(result.CallbackId); } } // Since unity mono doesn't support covariance and contravariance use this hack private static void CallCallback(object callback, IResult result) { if (callback == null || result == null) { return; } if (CallbackManager.TryCallCallback<IAppRequestResult>(callback, result) || CallbackManager.TryCallCallback<IShareResult>(callback, result) || CallbackManager.TryCallCallback<IGamingServicesFriendFinderResult>(callback, result) || CallbackManager.TryCallCallback<IIAPReadyResult>(callback, result) || CallbackManager.TryCallCallback<ICatalogResult>(callback, result) || CallbackManager.TryCallCallback<IPurchasesResult>(callback, result) || CallbackManager.TryCallCallback<IPurchaseResult>(callback, result) || CallbackManager.TryCallCallback<IConsumePurchaseResult>(callback, result) || CallbackManager.TryCallCallback<IInitCloudGameResult>(callback, result) || CallbackManager.TryCallCallback<IGameLoadCompleteResult>(callback, result) || CallbackManager.TryCallCallback<IScheduleAppToUserNotificationResult>(callback, result) || CallbackManager.TryCallCallback<IInterstitialAdResult>(callback, result) || CallbackManager.TryCallCallback<IRewardedVideoResult>(callback, result) || CallbackManager.TryCallCallback<IPayloadResult>(callback, result) || CallbackManager.TryCallCallback<ISessionScoreResult>(callback, result) || CallbackManager.TryCallCallback<ITournamentResult>(callback, result) || CallbackManager.TryCallCallback<ITournamentScoreResult>(callback, result) || CallbackManager.TryCallCallback<IGroupCreateResult>(callback, result) || CallbackManager.TryCallCallback<IGroupJoinResult>(callback, result) || CallbackManager.TryCallCallback<IMediaUploadResult>(callback, result) || CallbackManager.TryCallCallback<ICreateGamingContextResult>(callback, result) || CallbackManager.TryCallCallback<ISwitchGamingContextResult>(callback, result) || CallbackManager.TryCallCallback<IChooseGamingContextResult>(callback, result) || CallbackManager.TryCallCallback<IGetCurrentGamingContextResult>(callback, result) || CallbackManager.TryCallCallback<IPayResult>(callback, result) || CallbackManager.TryCallCallback<IAppLinkResult>(callback, result) || CallbackManager.TryCallCallback<ILoginResult>(callback, result) || CallbackManager.TryCallCallback<IAccessTokenRefreshResult>(callback, result) || CallbackManager.TryCallCallback<IHasLicenseResult>(callback, result) || CallbackManager.TryCallCallback<ILoginStatusResult>(callback, result) || CallbackManager.TryCallCallback<IProfileResult>(callback, result) || CallbackManager.TryCallCallback<IFriendFinderInvitationResult>(callback, result)) { return; } throw new NotSupportedException("Unexpected result type: " + callback.GetType().FullName); } private static bool TryCallCallback<T>(object callback, IResult result) where T : IResult { var castedCallback = callback as FacebookDelegate<T>; if (castedCallback != null) { castedCallback((T)result); return true; } return false; } } }