コード例 #1
0
ファイル: ClientSocket.cs プロジェクト: amozoss/CS3505
        /// <summary>
        /// If the request succeeded, the server should respond with
        ///
        ///UNDO SP OK LF
        ///Name:name LF; true 1;
        ///Version:version LF; true 2
        ///Cell:cell LF; true 3
        ///Length:length LF; true 4
        ///content LF; true 5
        ///
        ///Otherwise, the server should respond with
        ///
        ///UNDO SP FAIL LF
        ///Name:name LF; false 1
        ///message LF; false 2
        /// 
        /// 
        /// If there are no unsaved changes, the server should respond with
        /// 
        ///UNDO SP END LF
        ///Name:name LF
        ///Version:version LF
        ///
        ///If the client’s version is out of date, the server should respond with 
        ///
        ///UNDO SP WAIT LF
        ///Name:name LF
        ///Version:version LF
        ///
        /// </summary>
        /// <param name="message"></param>
        /// <param name="e"></param>
        /// <param name="payload"></param>
        private void UndoCallback(String message, Exception e, object payload)
        {
            if (message != null)
            {
                string[] spaceSplitup = message.Split(' ');
                string[] colonSplitup = message.Split(':');
                string colonFirstWord = "";
                UndoPayload load = new UndoPayload();
                if (payload is UndoPayload)
                {
                    load = (UndoPayload)payload;
                }

                if (colonSplitup.Length > 0)
                    colonFirstWord = colonSplitup[0].ToUpper().Trim();

                ///Name:name LF; true 1;
                ///Version:version LF; true 2
                ///Cell:cell LF; true 3
                ///Length:length LF; true 4
                ///content LF; true 5
                if (load.valid)
                {
                    if (colonFirstWord.Equals("NAME") && load.number == 1)
                    {
                        // get name
                        Debug.WriteLine("Undo name Response Recognized");
                        load.number = 2;
                        socket.BeginReceive(UndoCallback, load, CustomNetworking.callbacks.UNDO);
                    }
                    else if (colonFirstWord.Equals("VERSION") && load.number == 2)
                    {
                        // get Version
                        Debug.WriteLine("Undo version Response Recognized");
                        updateVersion(getSecondWord(colonSplitup));
                        load.number = 3;
                        socket.BeginReceive(UndoCallback, load, CustomNetworking.callbacks.UNDO);
                    }
                    else if (colonFirstWord.Equals("CELL") && load.number == 3)
                    {
                        // get cell
                        Debug.WriteLine("Undo cell Response Recognized");
                        load.cell = getSecondWord(colonSplitup);
                        load.number = 4;
                        socket.BeginReceive(UndoCallback, load, CustomNetworking.callbacks.UNDO);
                    }
                    else if (colonFirstWord.Equals("LENGTH") && load.number == 4)
                    {
                        // get length
                        Debug.WriteLine("Undo length Response Recognized");
                        load.number = 5;
                        int lNum = 0;
                        Int32.TryParse(getSecondWord(colonSplitup), out lNum);
                        load.contentLength = lNum;
                        socket.BeginReceive(UndoCallback, load, CustomNetworking.callbacks.UNDO);
                    }
                    else if (load.number == 5)
                    {
                        // must be the content
                        Debug.WriteLine("Undo content Response Recognized");
                        e_Cell(load.cell, message);
                        clientGUI_SS("random", false);
                        socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                    }
                    else
                    {
                        // something went wrong
                        // @todo handle error
                        socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                        Debug.WriteLine("Undo unrecognized commands valid {0}", message);

                    }
                }

                else if (!load.valid)
                {
                    switch (load.number)
                    {
                        case 1:                                         // It is FAIL's name.
                            socket.BeginReceive(UndoCallback, new Payload(2, false), CustomNetworking.callbacks.UNDO);
                            Debug.WriteLine("Undo fail name Response Recognized");

                            break;
                        case (int)SpecialStatus.UNDO_END:                                       // It is END's name.
                            socket.BeginReceive(UndoCallback, new Payload((int)SpecialStatus.UNDO_END + 1, false), CustomNetworking.callbacks.UNDO);
                            Debug.WriteLine("Undo end name Response Recognized");

                            break;
                        case (int)SpecialStatus.UNDO_WAIT:                                       // It is WAIT's name.
                            socket.BeginReceive(UndoCallback, new Payload((int)SpecialStatus.UNDO_WAIT + 1, false), CustomNetworking.callbacks.UNDO);
                            Debug.WriteLine("Undo wait name Response Recognized");
                            break;
                        case 2:                                         // It is FAIL's message.
                            socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                            Debug.WriteLine("Undo fail message Response Recognized");
                            clientGUI_SS(message, true);
                            break;
                        case 201:                                       // It is WAIT's Version.
                            socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                            Debug.WriteLine("End version Response Recognized");
                            break;
                        case 101:                                       // It is END's Version.
                            socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                            Debug.WriteLine("Wait version Response Recognized");
                            clientGUI_SS("YOu can no longer undo!", true);
                            break;
                        default:
                            // something went wrong
                            // @todo handle error
                            Debug.WriteLine("Undo fail unrecognized command", message);

                            socket.BeginReceive(MasterCallback, null, CustomNetworking.callbacks.MASTER);
                            break;
                    }
                }
            }
        }
コード例 #2
0
ファイル: ClientSocket.cs プロジェクト: amozoss/CS3505
        /// <summary>
        /// Master callback deals with the first "line" of every server response
        /// 
        /// Passed to CreateSSCallback
        /// CREATE SP OK LF
        /// CREATE SP FAIL LF
        /// 
        /// Passed to JoinSSCallback
        /// JOIN SP OK LF
        /// JOIN SP FAIL LF
        /// 
        /// Passed to ChangeCellCallback
        /// CHANGE SP OK LF
        /// CHANGE SP FAIL LF
        /// 
        /// Passed to UndoCallback
        /// UNDO SP OK LF
        /// UNDO SP FAIL LF
        /// UNDO SP WAIT LF
        /// UNDO SP END LF
        /// 
        /// Passed to SaveCallback
        /// SAVE SP OK LF
        /// SAVE SP FAIL LF
        /// 
        /// Passed to UpdateCallback
        /// UPDATE
        /// 
        /// 
        /// </summary>
        /// <param name="message"></param>
        /// <param name="e"></param>
        /// <param name="payload"></param>
        private void MasterCallback(String message, Exception e, object o)
        {
            if (message != null)
            {

                string[] spaceSplit = message.Split(' ');
                string firstWord = "";
                Payload payload = new Payload(0, false);
                UpdatePayload upPay = new UpdatePayload();
                UndoPayload undoPay = new UndoPayload();

                if (spaceSplit.Length > 0)
                    firstWord = spaceSplit[0].ToUpper().Trim();

                // Check the status
                string secondWord = "";
                if (spaceSplit.Length > 1)
                    secondWord = spaceSplit[1].ToUpper().Trim();

                // Deal with Each status
                if (secondWord.Equals("OK"))
                {
                    //passed
                    payload = new Payload(1, true);
                    if (firstWord.Equals("CHANGE"))
                    {
                        changePayload.valid = true;
                        changePayload.number = 1;
                    }
                    else if (firstWord.Equals("UNDO"))
                    {
                        undoPay.valid = true;
                        undoPay.number = 1;
                    }
                }
                else if (secondWord.Equals("FAIL"))
                {
                    //failed
                    payload = new Payload(1, false);
                    if (firstWord.Equals("CHANGE"))
                    {
                        changePayload.valid = false;
                        changePayload.number = 1;
                    }
                    else if (firstWord.Equals("UNDO"))
                    {
                        undoPay.valid = false;
                        undoPay.number = 1;
                    }
                }
                else if (secondWord.Equals("WAIT"))
                {
                    if (firstWord.Equals("UNDO"))
                    {
                        //Undo wait message

                        undoPay.valid = false;
                        undoPay.number = (int)SpecialStatus.UNDO_WAIT;
                    }
                    else if (firstWord.Equals("CHANGE"))
                    {
                        //changes wait message

                        changePayload.valid = false;
                        changePayload.number = (int)SpecialStatus.CHANGE_WAIT;
                        changePayload.availability = ChangeStatus.WAITING_TO_SEND;
                    }
                }
                else if (firstWord.Equals("UPDATE"))
                {
                    upPay.number = 1;
                    upPay.valid = true;
                }
                else if (secondWord.Equals("END"))
                {
                    //Undo end message
                    undoPay.valid = false;
                    undoPay.number = (int)SpecialStatus.UNDO_END;
                }
                else if (!firstWord.Equals("UPDATE"))
                {
                    // there was an error
                    // @todo handle error
                    socket.BeginReceive(MasterCallback, payload, CustomNetworking.callbacks.MASTER);
                }

                switch (firstWord)
                {
                    case "CREATE": socket.BeginReceive(CreateSSCallback, payload, CustomNetworking.callbacks.CREATE);
                        Debug.WriteLine("Create Response Recognized");
                        break;
                    case "JOIN": socket.BeginReceive(JoinSSCallback, payload, CustomNetworking.callbacks.JOIN);
                        Debug.WriteLine("Join Response Recognized");
                        break;
                    case "CHANGE": socket.BeginReceive(ChangeCellCallback, changePayload, CustomNetworking.callbacks.CHANGE);
                        Debug.WriteLine("Change Response Recognized");
                        break;
                    case "UNDO": socket.BeginReceive(UndoCallback, undoPay, CustomNetworking.callbacks.UNDO);
                        Debug.WriteLine("Undo Response Recognized");
                        break;
                    case "SAVE": socket.BeginReceive(SaveCallback, payload, CustomNetworking.callbacks.SAVE);
                        Debug.WriteLine("Save Response Recognized");
                        break;
                    case "UPDATE": socket.BeginReceive(UpdateCallback, upPay, CustomNetworking.callbacks.UPDATE);
                        Debug.WriteLine("Update Response Recognized");
                        break;
                    default: socket.BeginReceive(MasterCallback, payload, CustomNetworking.callbacks.MASTER); // If all else fails just call the master
                        Debug.WriteLine("Mastercallback: unrecognized command {0}", message);
                        resetChangePayload();
                        //clientGUI_SS(message, true);
                        break;
                }
            }
        }