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)); } }
/// <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 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)); }
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); }
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); }
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()); }
/// <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); }
/// <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); }
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)); } }
/// <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); }
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)); } }
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)); } }
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)); } }
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)); } }
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)); } }
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 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)); } }
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)); } }
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); }
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)); } }
private static bool InternalShouldReinviteDisconnectedPlayerCallback(IntPtr delegatePtr, IntPtr match, IntPtr player) { 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)); return(forwarder.InvokeOnListener(l => l.ShouldReinviteDisconnectedPlayer(gkMatch, gkPlayer))); } return(false); }
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 }
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)); } }
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); }
private static void InternalSingleMatchCallback(IntPtr match, IntPtr error, IntPtr secondaryCallback) { if (PInvokeUtil.IsNull(secondaryCallback)) { return; } GKTurnBasedMatch gkMatch = InteropObjectFactory <GKTurnBasedMatch> .FromPointer(match, ptr => new GKTurnBasedMatch(ptr)); NSError nsError = PInvokeUtil.IsNotNull(error) ? new NSError(error) : null; PInvokeCallbackUtil.PerformInternalCallback( "GKTurnBasedMatch#InternalSingleMatchCallback", PInvokeCallbackUtil.Type.Temporary, gkMatch, nsError, secondaryCallback); }
private static void InternalUIDidFinishPickingMediaWithInfoCallback(IntPtr delegatePtr, IntPtr pickerPtr, IntPtr infoPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { // Picker. var picker = InteropObjectFactory <UIImagePickerController> .FromPointer(pickerPtr, ptr => new UIImagePickerController(ptr)); // Info. var infoDict = InteropObjectFactory <NSDictionary <NSString, iOSObjectProxy> > .FromPointer(infoPtr, ptr => new NSDictionary <NSString, iOSObjectProxy>(ptr)); // Invoke consumer delegates. forwarder.InvokeOnListener(l => l.ImagePickerControllerDidFinishPickingMediaWithInfo(picker, infoDict)); } }
private static void InternalMatchmakerViewControllerDidFailWithErrorCallback( /* InteropGKMatchmakerViewControllerDelegate */ IntPtr delegatePtr, /* InteropGKMatchmakerViewController */ IntPtr viewControllerPtr, /* InteropNSError */ IntPtr errorPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var vc = InteropObjectFactory <GKMatchmakerViewController> .FromPointer( viewControllerPtr, ptr => new GKMatchmakerViewController(ptr)); var error = InteropObjectFactory <NSError> .FromPointer(errorPtr, p => new NSError(p)); forwarder.InvokeOnListener(l => l.MatchmakerViewControllerDidFailWithError(vc, error)); } }
private static void InternalMatchmakerViewControllerDidFindHostedPlayersCallback( /* InteropGKMatchmakerViewControllerDelegate */ IntPtr delegatePtr, /* InteropGKMatchmakerViewController */ IntPtr viewControllerPtr, /* InteropNSArray<InteropGKPlayer> */ IntPtr playerArrayPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var vc = InteropObjectFactory <GKMatchmakerViewController> .FromPointer( viewControllerPtr, ptr => new GKMatchmakerViewController(ptr)); var array = InteropObjectFactory <NSArray <GKPlayer> > .FromPointer(playerArrayPtr, p => new NSArray <GKPlayer>(p)); forwarder.InvokeOnListener(l => l.MatchmakerViewControllerDidFindHostedPlayers(vc, array)); } }