Ejemplo n.º 1
0
        private Invitation ConvertInvitation(AndroidJavaObject invObj)
        {
            Logger.d("Converting Android invitation to our Invitation object.");
            string      invitationId = invObj.Call <string>("getInvitationId");
            int         invType      = invObj.Call <int>("getInvitationType");
            Participant inviter;

            using (AndroidJavaObject inviterObj = invObj.Call <AndroidJavaObject>("getInviter")) {
                inviter = JavaUtil.ConvertParticipant(inviterObj);
            }
            int variant = invObj.Call <int>("getVariant");

            Invitation.InvType type;

            switch (invType)
            {
            case JavaConsts.INVITATION_TYPE_REAL_TIME:
                type = Invitation.InvType.RealTime;
                break;

            case JavaConsts.INVITATION_TYPE_TURN_BASED:
                type = Invitation.InvType.TurnBased;
                break;

            default:
                Logger.e("Unknown invitation type " + invType);
                type = Invitation.InvType.Unknown;
                break;
            }

            Invitation result = new Invitation(type, invitationId, inviter, variant);

            Logger.d("Converted invitation: " + result.ToString());
            return(result);
        }
Ejemplo n.º 2
0
        public static TurnBasedMatch ConvertMatch(string playerId, AndroidJavaObject matchObj)
        {
            List <AndroidJavaObject> list = new List <AndroidJavaObject>();

            Logger.d("AndroidTbmpClient.ConvertMatch, playerId=" + playerId);
            List <Participant> list2             = new List <Participant>();
            string             matchId           = matchObj.Call <string>("getMatchId", new object[0]);
            AndroidJavaObject  androidJavaObject = JavaUtil.CallNullSafeObjectMethod(matchObj, "getData", new object[0]);

            list.Add(androidJavaObject);
            byte[] data       = JavaUtil.ConvertByteArray(androidJavaObject);
            bool   canRematch = matchObj.Call <bool>("canRematch", new object[0]);
            int    availableAutomatchSlots = matchObj.Call <int>("getAvailableAutoMatchSlots", new object[0]);
            string selfParticipantId       = matchObj.Call <string>("getParticipantId", new object[]
            {
                playerId
            });
            AndroidJavaObject androidJavaObject2 = matchObj.Call <AndroidJavaObject>("getParticipantIds", new object[0]);

            list.Add(androidJavaObject2);
            int num = androidJavaObject2.Call <int>("size", new object[0]);

            for (int i = 0; i < num; i++)
            {
                string text = androidJavaObject2.Call <string>("get", new object[]
                {
                    i
                });
                AndroidJavaObject androidJavaObject3 = matchObj.Call <AndroidJavaObject>("getParticipant", new object[]
                {
                    text
                });
                list.Add(androidJavaObject3);
                Participant item = JavaUtil.ConvertParticipant(androidJavaObject3);
                list2.Add(item);
            }
            string pendingParticipantId = matchObj.Call <string>("getPendingParticipantId", new object[0]);

            TurnBasedMatch.MatchTurnStatus turnStatus  = JavaUtil.ConvertTurnStatus(matchObj.Call <int>("getTurnStatus", new object[0]));
            TurnBasedMatch.MatchStatus     matchStatus = JavaUtil.ConvertMatchStatus(matchObj.Call <int>("getStatus", new object[0]));
            int variant = matchObj.Call <int>("getVariant", new object[0]);

            foreach (AndroidJavaObject current in list)
            {
                if (current != null)
                {
                    current.Dispose();
                }
            }
            list2.Sort();
            return(new TurnBasedMatch(matchId, data, canRematch, selfParticipantId, list2, availableAutomatchSlots, pendingParticipantId, turnStatus, matchStatus, variant));
        }
Ejemplo n.º 3
0
        private Invitation ConvertInvitation(AndroidJavaObject invObj)
        {
            Logger.d("Converting Android invitation to our Invitation object.");
            string      invId = invObj.Call <string>("getInvitationId", new object[0]);
            int         num   = invObj.Call <int>("getInvitationType", new object[0]);
            Participant inviter;

            using (AndroidJavaObject androidJavaObject = invObj.Call <AndroidJavaObject>("getInviter", new object[0]))
            {
                inviter = JavaUtil.ConvertParticipant(androidJavaObject);
            }
            int variant = invObj.Call <int>("getVariant", new object[0]);
            int num2    = num;

            Invitation.InvType invType;
            if (num2 != 0)
            {
                if (num2 != 1)
                {
                    Logger.e("Unknown invitation type " + num);
                    invType = Invitation.InvType.Unknown;
                }
                else
                {
                    invType = Invitation.InvType.TurnBased;
                }
            }
            else
            {
                invType = Invitation.InvType.RealTime;
            }
            Invitation invitation = new Invitation(invType, invId, inviter, variant);

            Logger.d("Converted invitation: " + invitation.ToString());
            return(invitation);
        }
Ejemplo n.º 4
0
        public static TurnBasedMatch ConvertMatch(string playerId, AndroidJavaObject matchObj)
        {
            List <AndroidJavaObject> toDispose = new List <AndroidJavaObject>();

            Logger.d("AndroidTbmpClient.ConvertMatch, playerId=" + playerId);

            string matchId;

            byte[]             data;
            bool               canRematch;
            int                availableAutomatchSlots;
            string             selfParticipantId;
            List <Participant> participants = new List <Participant>();
            string             pendingParticipantId;

            TurnBasedMatch.MatchTurnStatus turnStatus;
            TurnBasedMatch.MatchStatus     matchStatus;
            int variant;

            matchId = matchObj.Call <string>("getMatchId");
            AndroidJavaObject dataObj = JavaUtil.CallNullSafeObjectMethod(matchObj, "getData");

            toDispose.Add(dataObj);
            data       = JavaUtil.ConvertByteArray(dataObj);
            canRematch = matchObj.Call <bool>("canRematch");
            availableAutomatchSlots = matchObj.Call <int>("getAvailableAutoMatchSlots");
            selfParticipantId       = matchObj.Call <string>("getParticipantId", playerId);

            AndroidJavaObject participantIds = matchObj.Call <AndroidJavaObject>("getParticipantIds");

            toDispose.Add(participantIds);
            int participantCount = participantIds.Call <int>("size");

            for (int i = 0; i < participantCount; i++)
            {
                string            thisId   = participantIds.Call <string>("get", i);
                AndroidJavaObject thisPart = matchObj.Call <AndroidJavaObject>("getParticipant", thisId);
                toDispose.Add(thisPart);
                Participant p = JavaUtil.ConvertParticipant(thisPart);
                participants.Add(p);
            }

            pendingParticipantId = matchObj.Call <string>("getPendingParticipantId");
            turnStatus           = JavaUtil.ConvertTurnStatus(matchObj.Call <int>("getTurnStatus"));
            matchStatus          = JavaUtil.ConvertMatchStatus(matchObj.Call <int>("getStatus"));
            variant = matchObj.Call <int>("getVariant");

            // cleanup
            foreach (AndroidJavaObject obj in toDispose)
            {
                if (obj != null)
                {
                    obj.Dispose();
                }
            }

            // participants should be sorted by participant ID
            participants.Sort();

            return(new TurnBasedMatch(matchId, data, canRematch, selfParticipantId,
                                      participants, availableAutomatchSlots,
                                      pendingParticipantId, turnStatus, matchStatus, variant));
        }
Ejemplo n.º 5
0
        // called from UI thread
        private void UpdateRoom()
        {
            List <AndroidJavaObject> toDispose = new List <AndroidJavaObject>();

            Logger.d("UpdateRoom: Updating our cached data about the room.");

            string roomId = mRoom.Call <string>("getRoomId");

            Logger.d("UpdateRoom: room id: " + roomId);

            Logger.d("UpdateRoom: querying for my player ID.");
            string playerId = mClient.GHManager.CallGmsApi <string>("games.Games", "Players",
                                                                    "getCurrentPlayerId");

            Logger.d("UpdateRoom: my player ID is: " + playerId);
            Logger.d("UpdateRoom: querying for my participant ID in the room.");
            string myPartId = mRoom.Call <string>("getParticipantId", playerId);

            Logger.d("UpdateRoom: my participant ID is: " + myPartId);

            AndroidJavaObject participantIds = mRoom.Call <AndroidJavaObject>("getParticipantIds");

            toDispose.Add(participantIds);
            int participantCount = participantIds.Call <int>("size");

            Logger.d("UpdateRoom: # participants: " + participantCount);

            List <Participant> connectedParticipants = new List <Participant>();
            List <Participant> allParticipants       = new List <Participant>();

            mSelf = null;
            for (int i = 0; i < participantCount; i++)
            {
                Logger.d("UpdateRoom: querying participant #" + i);
                string thisId = participantIds.Call <string>("get", i);
                Logger.d("UpdateRoom: participant #" + i + " has id: " + thisId);
                AndroidJavaObject thisPart = mRoom.Call <AndroidJavaObject>("getParticipant", thisId);
                toDispose.Add(thisPart);

                Participant p = JavaUtil.ConvertParticipant(thisPart);
                allParticipants.Add(p);

                if (p.ParticipantId.Equals(myPartId))
                {
                    Logger.d("Participant is SELF.");
                    mSelf = p;
                }

                if (p.IsConnectedToRoom)
                {
                    connectedParticipants.Add(p);
                }
            }

            if (mSelf == null)
            {
                Logger.e("List of room participants did not include self, " +
                         " participant id: " + myPartId + ", player id: " + playerId);
                // stopgap:
                mSelf = new Participant("?", myPartId, Participant.ParticipantStatus.Unknown,
                                        new GooglePlayGames.BasicApi.Multiplayer.Player("?", playerId), false);
            }

            connectedParticipants.Sort();
            allParticipants.Sort();

            string[] newlyConnected;
            string[] newlyDisconnected;

            // lock the list because it's read by the game thread
            lock (mParticipantListsLock) {
                newlyConnected    = SubtractParticipants(connectedParticipants, mConnectedParticipants);
                newlyDisconnected = SubtractParticipants(mConnectedParticipants, connectedParticipants);

                // IMPORTANT: we treat mConnectedParticipants as an immutable list; we give
                // away references to it to the callers of our API, so anyone out there might
                // be holding a reference to it and reading it from any thread.
                // This is why, instead of modifying it in place, we assign a NEW list to it.
                mConnectedParticipants = connectedParticipants;
                mAllParticipants       = allParticipants;
                Logger.d("UpdateRoom: participant list now has " + mConnectedParticipants.Count +
                         " participants.");
            }

            // cleanup
            Logger.d("UpdateRoom: cleanup.");
            foreach (AndroidJavaObject obj in toDispose)
            {
                obj.Dispose();
            }

            Logger.d("UpdateRoom: newly connected participants: " + newlyConnected.Length);
            Logger.d("UpdateRoom: newly disconnected participants: " + newlyDisconnected.Length);

            // only deliver peers connected/disconnected events if have delivered OnRoomConnected
            if (mDeliveredRoomConnected)
            {
                if (newlyConnected.Length > 0 && mRtmpListener != null)
                {
                    Logger.d("UpdateRoom: calling OnPeersConnected callback");
                    mRtmpListener.OnPeersConnected(newlyConnected);
                }
                if (newlyDisconnected.Length > 0 && mRtmpListener != null)
                {
                    Logger.d("UpdateRoom: calling OnPeersDisconnected callback");
                    mRtmpListener.OnPeersDisconnected(newlyDisconnected);
                }
            }

            // did the developer request to leave the room?
            if (mLeaveRoomRequested)
            {
                Clear("deferred leave-room request");
            }

            // is it time to report progress during room setup?
            if (!mDeliveredRoomConnected)
            {
                DeliverRoomSetupProgressUpdate();
            }
        }
Ejemplo n.º 6
0
        private void UpdateRoom()
        {
            List <AndroidJavaObject> list = new List <AndroidJavaObject>();

            Logger.d("UpdateRoom: Updating our cached data about the room.");
            string str = this.mRoom.Call <string>("getRoomId", new object[0]);

            Logger.d("UpdateRoom: room id: " + str);
            Logger.d("UpdateRoom: querying for my player ID.");
            string text = this.mClient.GHManager.CallGmsApi <string>("games.Games", "Players", "getCurrentPlayerId", new object[0]);

            Logger.d("UpdateRoom: my player ID is: " + text);
            Logger.d("UpdateRoom: querying for my participant ID in the room.");
            string text2 = this.mRoom.Call <string>("getParticipantId", new object[]
            {
                text
            });

            Logger.d("UpdateRoom: my participant ID is: " + text2);
            AndroidJavaObject androidJavaObject = this.mRoom.Call <AndroidJavaObject>("getParticipantIds", new object[0]);

            list.Add(androidJavaObject);
            int num = androidJavaObject.Call <int>("size", new object[0]);

            Logger.d("UpdateRoom: # participants: " + num);
            List <Participant> list2 = new List <Participant>();
            List <Participant> list3 = new List <Participant>();

            this.mSelf = null;
            for (int i = 0; i < num; i++)
            {
                Logger.d("UpdateRoom: querying participant #" + i);
                string text3 = androidJavaObject.Call <string>("get", new object[]
                {
                    i
                });
                Logger.d(string.Concat(new object[]
                {
                    "UpdateRoom: participant #",
                    i,
                    " has id: ",
                    text3
                }));
                AndroidJavaObject androidJavaObject2 = this.mRoom.Call <AndroidJavaObject>("getParticipant", new object[]
                {
                    text3
                });
                list.Add(androidJavaObject2);
                Participant participant = JavaUtil.ConvertParticipant(androidJavaObject2);
                list3.Add(participant);
                if (participant.ParticipantId.Equals(text2))
                {
                    Logger.d("Participant is SELF.");
                    this.mSelf = participant;
                }
                if (participant.IsConnectedToRoom)
                {
                    list2.Add(participant);
                }
            }
            if (this.mSelf == null)
            {
                Logger.e("List of room participants did not include self,  participant id: " + text2 + ", player id: " + text);
                this.mSelf = new Participant("?", text2, Participant.ParticipantStatus.Unknown, new Player("?", text), false);
            }
            list2.Sort();
            list3.Sort();
            object obj = this.mParticipantListsLock;

            string[] array;
            string[] array2;
            lock (obj)
            {
                array  = this.SubtractParticipants(list2, this.mConnectedParticipants);
                array2 = this.SubtractParticipants(this.mConnectedParticipants, list2);
                this.mConnectedParticipants = list2;
                this.mAllParticipants       = list3;
                Logger.d("UpdateRoom: participant list now has " + this.mConnectedParticipants.Count + " participants.");
            }
            Logger.d("UpdateRoom: cleanup.");
            foreach (AndroidJavaObject current in list)
            {
                current.Dispose();
            }
            Logger.d("UpdateRoom: newly connected participants: " + array.Length);
            Logger.d("UpdateRoom: newly disconnected participants: " + array2.Length);
            if (this.mDeliveredRoomConnected)
            {
                if (array.Length > 0 && this.mRtmpListener != null)
                {
                    Logger.d("UpdateRoom: calling OnPeersConnected callback");
                    this.mRtmpListener.OnPeersConnected(array);
                }
                if (array2.Length > 0 && this.mRtmpListener != null)
                {
                    Logger.d("UpdateRoom: calling OnPeersDisconnected callback");
                    this.mRtmpListener.OnPeersDisconnected(array2);
                }
            }
            if (this.mLeaveRoomRequested)
            {
                this.Clear("deferred leave-room request");
            }
            if (!this.mDeliveredRoomConnected)
            {
                this.DeliverRoomSetupProgressUpdate();
            }
        }