/// <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; } } } }
/// <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; } } }