public List <Participant> GetConnectedParticipants()
        {
            // If no match is connected, simply return null.
            if (mCurrentMatch == null)
            {
                return(null);
            }

            var list = new List <Participant>();

            // First grab the connected peers.
            var playersNSArray = mCurrentMatch.Players;

            if (playersNSArray != null)
            {
                var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr)));
                list.AddRange(players.Select(p => Participant.FromGKPlayer(p, Participant.ParticipantStatus.Joined, true)));
            }

            // Add the local player (self) as GameKit doesn't include this.
            list.Add(Participant.FromGKPlayer(
                         GKLocalPlayer.LocalPlayer,
                         Participant.ParticipantStatus.Joined,
                         true));

            // Sort the participants based on their ID and return the sorted list.
            return(list.OrderBy(p => p.ParticipantId).ToList());
        }
        public Participant GetParticipant(string participantId)
        {
            if (string.IsNullOrEmpty(participantId))
            {
                return(null);
            }

            if (mCurrentMatch == null)
            {
                return(null);
            }

            var playersNSArray = mCurrentMatch.Players;

            if (playersNSArray == null)
            {
                return(null);
            }

            var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr)));

            return(Participant.FromGKPlayer(
                       players.FirstOrDefault(p => p.PlayerID.Equals(participantId)),
                       Participant.ParticipantStatus.Joined,
                       true));
        }
Esempio n. 3
0
        private static void InternalDidRequestMatchWithOtherPlayersCallback(IntPtr listenerPtr, IntPtr player, IntPtr playersToInvite)
        {
            var forwarder = FromPointer(listenerPtr);

            if (forwarder != null && forwarder.ListenerCount > 0)
            {
                // GKPlayer.
                GKPlayer gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr));

                // GKPlayer[].
                GKPlayer[] gkPlayersToInvite = null;

                if (PInvokeUtil.IsNotNull(playersToInvite))
                {
                    // Creating a one-time usage NSArray binder, no need to use the factory.
                    using (var nsArray = new NSArray <GKPlayer>(playersToInvite))
                    {
                        gkPlayersToInvite = nsArray.ToArray(ptr => InteropObjectFactory <GKPlayer> .FromPointer(ptr, p => new GKPlayer(p)));
                    }
                }

                // Invoke consumer delegates.
                forwarder.InvokeOnAllListeners(l => l.PlayerDidRequestMatchWithOtherPlayers(gkPlayer, gkPlayersToInvite));
            }
        }
        public void CreateWithMatchmakerUI(MatchRequest request, IRealTimeMultiplayerListener listener)
        {
            Util.NullArgumentTest(request);
            Util.NullArgumentTest(listener);

            if (mCurrentMatchmakerVC != null)
            {
                Debug.Log("Ignoring CreateWithMatchmakerUI call because another matchmaker UI is being shown.");
                return;
            }

            // Create a new GKMatchmakerViewController.
            var vc = InteropObjectFactory <GKMatchmakerViewController> .Create(
                () =>
            {
                using (var gkReq = request.ToGKMatchRequest())
                    return(new GKMatchmakerViewController(gkReq));
            },
                viewController =>
            {
                return(viewController.ToPointer());
            });

            // Create a delgate for the vc.
            vc.MatchmakerDelegate = new InternalGKMatchmakerViewControllerDelegateImpl(this, listener);

            // Store the VC ref.
            mCurrentMatchmakerVC = vc;

            // Now show the VC.
            using (var unityVC = UIViewController.UnityGetGLViewController())
                unityVC.PresentViewController(vc, true, null);
        }
Esempio n. 5
0
        /// <summary>
        /// Construct a new instance from <see cref="EasyMobile.iOS.GameKit.GKTurnBasedMatch"/> object.
        /// </summary>
        /// <returns>The GK turn based match.</returns>
        /// <param name="turnBasedMatch">Turn based match.</param>
        internal static TurnBasedMatch FromGKTurnBasedMatch(GKTurnBasedMatch turnBasedMatch)
        {
            if (turnBasedMatch == null)
            {
                return(null);
            }

            // Cache values to save on calls to native side.
            var currentGKParticipant = turnBasedMatch.CurrentParticipant;
            var nsParticipantsArray  = turnBasedMatch.Participants;
            var nsMatchData          = turnBasedMatch.MatchData;

            var currentGKPlayer = currentGKParticipant != null ? currentGKParticipant.Player : null;
            var allParticipants = nsParticipantsArray == null ? null : nsParticipantsArray.ToArray(
                ptr => InteropObjectFactory <GKTurnBasedParticipant> .FromPointer(ptr, p => new GKTurnBasedParticipant(p)));
            var matchData = nsMatchData != null && nsMatchData.Length > 0 ? nsMatchData.ToBytes() : null;   // if data length == 0 we also return null to have a consistent behaviour between GC & GPG.

            return(new TurnBasedMatch(
                       turnBasedMatch.MatchID,
                       allParticipants == null ? 0 : allParticipants.Length,
                       matchData,
                       GKLocalPlayer.LocalPlayer == null ? null : GKLocalPlayer.LocalPlayer.PlayerID,                                                                  // GKTurnBasedMatch doesn't have 'SelfParticipantId', using the equivalent local player's ID
                       allParticipants == null ? null : allParticipants.Where(p => p.Player != null).Select(p => Participant.FromGKTurnBasedParticipant(p)).ToArray(), // only returns participants who have joined
                       currentGKPlayer == null ? null : currentGKPlayer.PlayerID,
                       turnBasedMatch.Status.ToTurnBasedMatchStatus())
            {
                GC_TurnBasedMatch = turnBasedMatch
            });
        }
        public void SendMessage(bool reliable, string participantId, byte[] data)
        {
            Util.NullArgumentTest(participantId);
            Util.NullArgumentTest(data);

            if (mCurrentMatch == null)
            {
                return;
            }

            // Cache the NSArray of players.
            var playersNSArray = mCurrentMatch.Players;

            if (playersNSArray == null)
            {
                return;
            }

            var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr)));
            var player  = players.FirstOrDefault(p => p.PlayerID.Equals(participantId));

            if (player == default(GKPlayer))
            {
                return;
            }

            NSError error;

            mCurrentMatch.SendData(
                data,
                new GKPlayer[] { player },
                reliable ? GKMatch.GKMatchSendDataMode.Reliable : GKMatch.GKMatchSendDataMode.Unreliable,
                out error);
        }
Esempio n. 7
0
        private static void InternalMultipleMatchesCallback(IntPtr matches, IntPtr error, IntPtr secondaryCallback)
        {
            if (PInvokeUtil.IsNull(secondaryCallback))
            {
                return;
            }

            GKTurnBasedMatch[] gkMatches = null;

            if (PInvokeUtil.IsNotNull(matches))
            {
                // Creating a one-time usage NSArray binder, no need to use the factory.
                using (var nsArray = new NSArray <GKTurnBasedMatch>(matches))
                {
                    gkMatches = nsArray.ToArray(ptr => InteropObjectFactory <GKTurnBasedMatch> .FromPointer(ptr, p => new GKTurnBasedMatch(p)));
                }
            }

            // A new NSError object is always created on native side, so no need
            // to check the binder pool for reusing an existing one.
            NSError nsError = PInvokeUtil.IsNotNull(error) ? new NSError(error) : null;

            // Invoke consumer callback.
            PInvokeCallbackUtil.PerformInternalCallback(
                "GKTurnBasedMatch#InternalMultipleMatchesCallback",
                PInvokeCallbackUtil.Type.Temporary,
                gkMatches, nsError, secondaryCallback);
        }
Esempio n. 8
0
        public void TakePicture(CameraType cameraType, Action <string, MediaResult> callback)
        {
            Util.NullArgumentTest(callback);

            if (mPickerController != null)
            {
                Debug.Log("Ignoring TakePicture call because another image picker UI is being shown.");
                return;
            }

            callback = RuntimeHelper.ToMainThread(callback);

            if (!IsCameraAvailable(cameraType))
            {
                callback(cameraType.ToString() + " camera is not supported on this device.", null);
                return;
            }

            // Create a new image picker.
            var picker = InteropObjectFactory <UIImagePickerController> .Create(
                () => new UIImagePickerController(),
                c => c.ToPointer());

            // Source type must be camera.
            picker.SourceType = UIImagePickerController.SourceTypeEnum.Camera;

            // Set camera type.
            picker.CameraDevice = cameraType == CameraType.Front ? UIImagePickerController.CameraDeviceEnum.Front : UIImagePickerController.CameraDeviceEnum.Rear;

            // Only allow image.
            NSMutableArray <NSString> mediaTypes = new NSMutableArray <NSString>();

            mediaTypes.AddObject(UTTypeConstants.kUTTypeImage);
            picker.MediaTypes = mediaTypes;

            // Create a delegate for the TBM VC.
            picker.Delegate = new InternalUIImagePickerControllerDelegate(InternalUIImagePickerControllerDelegate.PickerOperation.TakePicture)
            {
                CloseAndResetVC = () =>
                {
                    if (mPickerController != null)
                    {
                        mPickerController.DismissViewController(true, null);
                        mPickerController = null;
                    }
                },
                CompleteCallback = (error, result) =>
                {
                    callback(error, result);
                }
            };

            // Store the VC ref.
            mPickerController = picker;

            // Now show the VC.
            using (var unityVC = UIViewController.UnityGetGLViewController())
                unityVC.PresentViewController(picker, true, null);
        }
Esempio n. 9
0
        /// <summary>
        /// Returns an array of the available media types for the specified source type.
        /// </summary>
        /// <returns>An array of the available media types for the specified source type.</returns>
        /// <param name="sourceType">The source to use to pick an image.</param>
        public static NSArray <NSString> AvailableMediaTypesForSourceType(SourceTypeEnum sourceType)
        {
            var ptr     = C.UIImagePickerController_availableMediaTypesForSourceType(sourceType);
            var nsArray = InteropObjectFactory <NSArray <NSString> > .FromPointer(ptr, p => new NSArray <NSString>(p));

            CoreFoundation.CFFunctions.CFRelease(ptr);
            return(nsArray);
        }
Esempio n. 10
0
        /// <summary>
        /// Returns an array of NSNumber objects indicating the capture modes supported by a given camera device.
        /// </summary>
        /// <returns>An array of the capture modes.</returns>
        /// <param name="cameraDevice">Camera Device.</param>
        public static NSArray <NSString> AvailableCaptureModesForCameraDevice(CameraDeviceEnum cameraDevice)
        {
            var ptr     = C.UIImagePickerController_availableCaptureModesForCameraDevice(cameraDevice);
            var nsArray = InteropObjectFactory <NSArray <NSString> > .FromPointer(ptr, p => new NSArray <NSString>(p));

            CoreFoundation.CFFunctions.CFRelease(ptr);
            return(nsArray);
        }
Esempio n. 11
0
        public void TakeTurn(TurnBasedMatch match, byte[] data, string nextParticipantId, Action <bool> callback)
        {
            Util.NullArgumentTest(match);
            Util.NullArgumentTest(data);

            // Find the next GKTurnBasedParticipant with the given ID.
            var participants = match.GC_TurnBasedMatch.Participants.ToArray(
                ptr => InteropObjectFactory <GKTurnBasedParticipant> .FromPointer(ptr, p => new GKTurnBasedParticipant(p)));

            GKTurnBasedParticipant nextGKParticipant;

            if (string.IsNullOrEmpty(nextParticipantId))
            {
                // No specific next player, choosing the the next vacant slot.
                nextGKParticipant = participants.FirstOrDefault(p => p.Player == null);
            }
            else
            {
                // Find the specified next player.
                nextGKParticipant = participants.FirstOrDefault(p =>
                {
                    var gkPlayer = p.Player;
                    return(gkPlayer != null && gkPlayer.PlayerID.Equals(nextParticipantId));
                });
            }

            if (nextGKParticipant == default(GKTurnBasedParticipant))
            {
                Debug.LogErrorFormat("Not found next participant for ID {0}. Aborting TakeTurn...", string.IsNullOrEmpty(nextParticipantId) ? "[NullOrEmpty]" : nextParticipantId);

                if (callback != null)
                {
                    callback(false);
                }

                return;
            }

            match.GC_TurnBasedMatch.EndTurn(
                new GKTurnBasedParticipant[] { nextGKParticipant },
                GKTurnBasedMatch.GKTurnTimeoutDefault,
                data,
                error =>
            {
                if (error != null)
                {
                    Debug.Log("Failed to take turn with error " + error.LocalizedDescription);
                }

                if (callback != null)
                {
                    callback(error == null);
                }
            }
                );
        }
        private static void InternalUIDidCancelCallback(IntPtr delegatePtr, IntPtr pickerPtr)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var picker = InteropObjectFactory <UIImagePickerController> .FromPointer(pickerPtr, ptr => new UIImagePickerController(ptr));

                forwarder.InvokeOnListener(l => l.ImagePickerControllerDidCancel(picker));
            }
        }
Esempio n. 13
0
        /// <summary>
        /// Returns the singleton matchmaker instance.
        /// </summary>
        /// <returns>The matchmaker.</returns>
        public static GKMatchmaker SharedMatchmaker()
        {
            if (sSharedMatchmaker == null)
            {
                var ptr = C.GKMatchmaker_sharedMatchmaker();
                sSharedMatchmaker = InteropObjectFactory <GKMatchmaker> .FromPointer(ptr, p => new GKMatchmaker(p));

                CoreFoundation.CFFunctions.CFRelease(ptr);
            }
            return(sSharedMatchmaker);
        }
Esempio n. 14
0
        private static void InternalWasCancelledCallback(IntPtr delegatePtr, IntPtr viewController)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var vc = InteropObjectFactory <GKTurnBasedMatchmakerViewController> .FromPointer(
                    viewController, ptr => new GKTurnBasedMatchmakerViewController(ptr));

                forwarder.InvokeOnListener(l => l.TurnBasedMatchmakerViewControllerWasCancelled(vc));
            }
        }
Esempio n. 15
0
        private static void InternalPlayerDidChangeConnectionStateCallback(IntPtr delegatePtr, IntPtr match, IntPtr player, GKPlayerConnectionState state)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr));

                var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr));

                forwarder.InvokeOnListener(l => l.PlayerDidChangeConnectionState(gkMatch, gkPlayer, state));
            }
        }
Esempio n. 16
0
        private static void InternalWantsToQuitMatchCallback(IntPtr listenerPtr, IntPtr player, IntPtr match)
        {
            var forwarder = FromPointer(listenerPtr);

            if (forwarder != null && forwarder.ListenerCount > 0)
            {
                var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr));

                var gkTBMatch = InteropObjectFactory <GKTurnBasedMatch> .FromPointer(match, ptr => new GKTurnBasedMatch(ptr));

                forwarder.InvokeOnAllListeners(l => l.PlayerWantsToQuitMatch(gkPlayer, gkTBMatch));
            }
        }
Esempio n. 17
0
        private static void InternalMatchDidFailWithErrorCallback(IntPtr delegatePtr, IntPtr match, IntPtr error)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr));

                var nsError = InteropObjectFactory <NSError> .FromPointer(error, ptr => new NSError(ptr));

                forwarder.InvokeOnListener(l => l.MatchDidFailWithError(gkMatch, nsError));
            }
        }
Esempio n. 18
0
        private static void InternalPresentationControllerWillDismissCallback(IntPtr delegatePtr, IntPtr presentationControllerPtr)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                // PresentationController.
                var controller = InteropObjectFactory <UIPresentationController> .FromPointer(presentationControllerPtr, ptr => new UIPresentationController(ptr));

                // Invoke consumer delegates.
                forwarder.InvokeOnListener(l => l.PresentationControllerWillDismiss(controller));
            }
        }
Esempio n. 19
0
        public void PickContact(Action <string, Contact> callback)
        {
            var picker = InteropObjectFactory <CNContactPickerViewController> .Create(
                () => new CNContactPickerViewController(),
                c => c.ToPointer());

            picker.DisplayedPropertyKeys = GetPropertyKeys();

            picker.Delegate = new iOSContactsPickerCallback(callback, picker);

            using (var unityVC = UIViewController.UnityGetGLViewController())
                unityVC.PresentViewController(picker, true, null);
        }
Esempio n. 20
0
        private static void InternalDidAcceptInviteCallback(IntPtr listenerPtr, IntPtr player, IntPtr invite)
        {
            var forwarder = FromPointer(listenerPtr);

            if (forwarder != null && forwarder.ListenerCount > 0)
            {
                var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr));

                var gkInvite = InteropObjectFactory <GKInvite> .FromPointer(invite, ptr => new GKInvite(ptr));

                forwarder.InvokeOnAllListeners(l => l.PlayerDidAcceptInvite(gkPlayer, gkInvite));
            }
        }
Esempio n. 21
0
        private static void InternalReceivedTurnEventForMatchCallback(IntPtr listenerPtr, IntPtr player, IntPtr match, bool didBecomeActive)
        {
            var forwarder = FromPointer(listenerPtr);

            if (forwarder != null && forwarder.ListenerCount > 0)
            {
                var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr));

                var gkTBMatch = InteropObjectFactory <GKTurnBasedMatch> .FromPointer(match, ptr => new GKTurnBasedMatch(ptr));

                forwarder.InvokeOnAllListeners(l => l.PlayerReceivedTurnEventForMatch(gkPlayer, gkTBMatch, didBecomeActive));
            }
        }
        private static void InternalContactPickerDidSelectContactsCallback(IntPtr delegatePtr, IntPtr pickerPtr, IntPtr contactsPtr)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var picker = InteropObjectFactory <CNContactPickerViewController> .FromPointer(pickerPtr, ptr => new CNContactPickerViewController(ptr));

                var contacts = InteropObjectFactory <NSArray <CNContact> > .FromPointer(contactsPtr, ptr => new NSArray <CNContact>(ptr));

                forwarder.InvokeOnListener(l => l.ContactPickerDidSelectContacts(picker, contacts));
            }
        }
        private static void InternalContactPickerDidCancelCallback(IntPtr delegatePtr, IntPtr pickerPtr)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                // Picker.
                var picker = InteropObjectFactory <CNContactPickerViewController> .FromPointer(pickerPtr, ptr => new CNContactPickerViewController(ptr));

                // Invoke consumer delegates.
                forwarder.InvokeOnListener(l => l.ContactPickerDidCancel(picker));
            }
        }
Esempio n. 24
0
        public void Pick(Action <string, MediaResult[]> callback)
        {
            Util.NullArgumentTest(callback);

            if (mPickerController != null)
            {
                Debug.Log("Ignoring Pick call because another image picker UI is being shown.");
                return;
            }

            callback = RuntimeHelper.ToMainThread(callback);

            // Create a new image picker.
            var picker = InteropObjectFactory <UIImagePickerController> .Create(
                () => new UIImagePickerController(),
                c => c.ToPointer());

            // Source type must be photo library.
            picker.SourceType = UIImagePickerController.SourceTypeEnum.PhotoLibrary;

            // Allow image & video.
            NSMutableArray <NSString> mediaTypes = new NSMutableArray <NSString>();

            mediaTypes.AddObject(UTTypeConstants.kUTTypeImage);
            mediaTypes.AddObject(UTTypeConstants.kUTTypeMovie);
            picker.MediaTypes = mediaTypes;

            // Create a delegate for the TBM VC.
            picker.Delegate = new InternalUIImagePickerControllerDelegate(InternalUIImagePickerControllerDelegate.PickerOperation.PickGallery)
            {
                CloseAndResetMatchmakerVC = () =>
                {
                    if (mPickerController != null)
                    {
                        mPickerController.DismissViewController(true, null);
                        mPickerController = null;
                    }
                },
                CompleteCallback = (error, result) =>
                {
                    callback(error, result != null ? new MediaResult[] { result } : null);
                }
            };

            // Store the VC ref.
            mPickerController = picker;

            // Now show the VC.
            using (var unityVC = UIViewController.UnityGetGLViewController())
                unityVC.PresentViewController(picker, true, null);
        }
Esempio n. 25
0
        private static void InternalChooseBestHostingPlayerCallback(IntPtr player, IntPtr secondaryCallback)
        {
            if (PInvokeUtil.IsNull(secondaryCallback))
            {
                return;
            }

            var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, p => new GKPlayer(p));

            PInvokeCallbackUtil.PerformInternalCallback(
                "GKMatch#InternalChooseBestHostingPlayerCallback",
                PInvokeCallbackUtil.Type.Temporary,
                gkPlayer, secondaryCallback);
        }
Esempio n. 26
0
        private static void InternalDidFailWithErrorCallback(IntPtr delegatePtr, IntPtr viewController, IntPtr error)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var vc = InteropObjectFactory <GKTurnBasedMatchmakerViewController> .FromPointer(
                    viewController, ptr => new GKTurnBasedMatchmakerViewController(ptr));

                var e = InteropObjectFactory <NSError> .FromPointer(error, ptr => new NSError(ptr));

                forwarder.InvokeOnListener(l => l.TurnBasedMatchmakerViewControllerDidFailWithError(vc, e));
            }
        }
Esempio n. 27
0
        private static bool InternalPresentationControllerShouldDismissCallback(IntPtr delegatePtr, IntPtr presentationControllerPtr)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                // PresentationController.
                var controller = InteropObjectFactory <UIPresentationController> .FromPointer(presentationControllerPtr, ptr => new UIPresentationController(ptr));

                // Invoke consumer delegates.
                return(forwarder.InvokeOnListener(l => l.PresentationControllerShouldDismiss(controller)));
            }

            return(true);    // view should be dismissible by default
        }
Esempio n. 28
0
        public static GKMatchRequest ToGKMatchRequest(this MatchRequest matchRequest)
        {
            var gkRequest = InteropObjectFactory <GKMatchRequest> .Create(
                () => new GKMatchRequest(),
                req => req.ToPointer());

            gkRequest.MinPlayers = matchRequest.MinPlayers;
            gkRequest.MaxPlayers = matchRequest.MaxPlayers;
            /* We're not using DefaultNumberOfPlayers. */
            /* We're not using InviteMessage. */
            gkRequest.PlayerGroup      = matchRequest.Variant;           // GameKit playerGroup is equivalent to variant
            gkRequest.PlayerAttributes = ~matchRequest.ExclusiveBitmask; // cross-platform API uses "1" bits to exclude, while GameKit uses "0" bits.

            return(gkRequest);
        }
Esempio n. 29
0
        private static void InternalMatchDidReceiveDataCallback(IntPtr delegatePtr, IntPtr match, IntPtr data, IntPtr remotePlayer)
        {
            var forwarder = FromPointer(delegatePtr);

            if (forwarder != null && forwarder.Listener != null)
            {
                var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr));

                var nsData = InteropObjectFactory <NSData> .FromPointer(data, ptr => new NSData(ptr));

                var gkRemotePlayer = InteropObjectFactory <GKPlayer> .FromPointer(remotePlayer, ptr => new GKPlayer(ptr));

                forwarder.InvokeOnListener(l => l.MatchDidReceiveData(gkMatch, nsData, gkRemotePlayer));
            }
        }
Esempio n. 30
0
        private static void PlayerBoolCallback(
            /* InteropGKPlayer */ IntPtr playerPtr, bool boolArg, IntPtr secondaryCallback)
        {
            if (PInvokeUtil.IsNull(secondaryCallback))
            {
                return;
            }

            var player = InteropObjectFactory <GKPlayer> .FromPointer(playerPtr, p => new GKPlayer(p));

            PInvokeCallbackUtil.PerformInternalCallback(
                "GKMatchmaker#PlayerBoolCallback",
                PInvokeCallbackUtil.Type.Temporary,
                player, boolArg, secondaryCallback);
        }