Update of /cvsroot/freecol/freecol/src/net/sf/freecol/client/control In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv8141/src/net/sf/freecol/client/control Modified Files: ConnectController.java InGameController.java InGameInputHandler.java PreGameController.java PreGameInputHandler.java Log Message: Switching to streamed serialization of objects. Several savegame-related bugs has been fixed as well. Index: PreGameInputHandler.java =================================================================== RCS file: /cvsroot/freecol/freecol/src/net/sf/freecol/client/control/PreGameInputHandler.java,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** PreGameInputHandler.java 30 Aug 2006 17:34:49 -0000 1.19 --- PreGameInputHandler.java 25 Sep 2006 08:32:10 -0000 1.20 *************** *** 4,7 **** --- 4,11 ---- import java.util.logging.Logger; + import javax.xml.stream.XMLStreamException; + import javax.xml.stream.XMLStreamReader; + import javax.xml.stream.XMLStreamWriter; + import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.Canvas; *************** *** 9,12 **** --- 13,17 ---- import net.sf.freecol.common.model.Player; import net.sf.freecol.common.networking.Connection; + import net.sf.freecol.common.networking.StreamedMessageHandler; import org.w3c.dom.Element; *************** *** 17,21 **** * Handles the network messages that arrives before the game starts. */ ! public final class PreGameInputHandler extends InputHandler { private static final Logger logger = Logger.getLogger(PreGameInputHandler.class.getName()); --- 22,26 ---- * Handles the network messages that arrives before the game starts. */ ! public final class PreGameInputHandler extends InputHandler implements StreamedMessageHandler { private static final Logger logger = Logger.getLogger(PreGameInputHandler.class.getName()); *************** *** 63,68 **** } else if (type.equals("updateColor")) { reply = updateColor(element); - } else if (type.equals("updateGame")) { - reply = updateGame(element); } else if (type.equals("startGame")) { reply = startGame(element); --- 68,71 ---- *************** *** 81,84 **** --- 84,110 ---- } + /** + * Handles the main element of an XML message. + * + * @param connection The connection the message came from. + * @param in The stream containing the message. + * @param out The output stream for the reply. + */ + public void handle(Connection connection, XMLStreamReader in, XMLStreamWriter out) { + if (in.getLocalName().equals("updateGame")) { + updateGame(connection, in, out); + } else { + logger.warning("Unkown (streamed) request: " + in.getLocalName()); + } + } + + /** + * Checks if the message handler support the given message. + * @param tagName The tag name of the message to check. + * @return The result. + */ + public boolean accepts(String tagName) { + return tagName.equals("updateGame"); + } /** *************** *** 197,208 **** /** * Handles an "updateGame"-message. - * - * @param element The element (root element in a DOM-parsed XML tree) that - * holds all the information. */ ! private Element updateGame(Element element) { ! getFreeColClient().getGame().readFromXMLElement((Element) element.getElementsByTagName(Game.getXMLElementTagName()).item(0)); ! ! return null; } --- 223,234 ---- /** * Handles an "updateGame"-message. */ ! private void updateGame(Connection connection, XMLStreamReader in, XMLStreamWriter out) { ! try { ! in.nextTag(); ! getFreeColClient().getGame().readFromXML(in); ! } catch (XMLStreamException e) { ! logger.warning(e.toString()); ! } } Index: InGameController.java =================================================================== RCS file: /cvsroot/freecol/freecol/src/net/sf/freecol/client/control/InGameController.java,v retrieving revision 1.153 retrieving revision 1.154 diff -C2 -d -r1.153 -r1.154 *** InGameController.java 6 Sep 2006 22:00:01 -0000 1.153 --- InGameController.java 25 Sep 2006 08:32:10 -0000 1.154 *************** *** 357,361 **** } ! Colony colony = new Colony(game, (Element) reply.getChildNodes().item(0)); changeWorkType(unit, Goods.FOOD); unit.buildColony(colony); --- 357,367 ---- } ! Colony colony = (Colony) game.getFreeColGameObject(((Element) reply.getChildNodes().item(0)).getAttribute("ID")); ! if (colony == null) { ! colony = new Colony(game, (Element) reply.getChildNodes().item(0)); ! } else { ! colony.readFromXMLElement((Element) reply.getChildNodes().item(0)); ! } ! changeWorkType(unit, Goods.FOOD); unit.buildColony(colony); *************** *** 938,943 **** // Get the defender: Element unitElement = getChildElement(attackResultElement, Unit.getXMLElementTagName()); ! if (unitElement != null) { ! defender = new Unit(game, unitElement); defender.setLocation(target); } else { --- 944,954 ---- // Get the defender: Element unitElement = getChildElement(attackResultElement, Unit.getXMLElementTagName()); ! if (unitElement != null) { ! defender = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (defender == null) { ! defender = new Unit(game, unitElement); ! } else { ! defender.readFromXMLElement(unitElement); ! } defender.setLocation(target); } else { *************** *** 1900,1904 **** Element reply = client.ask(trainUnitInEuropeElement); if (reply.getTagName().equals("trainUnitInEuropeConfirmed")) { ! Unit unit = new Unit(game, (Element) reply.getChildNodes().item(0)); europe.train(unit); } else { --- 1911,1921 ---- Element reply = client.ask(trainUnitInEuropeElement); if (reply.getTagName().equals("trainUnitInEuropeConfirmed")) { ! Element unitElement = (Element) reply.getChildNodes().item(0); ! Unit unit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (unit == null) { ! unit = new Unit(game, unitElement); ! } else { ! unit.readFromXMLElement(unitElement); ! } europe.train(unit); } else { *************** *** 1960,1964 **** Element reply = client.ask(recruitUnitInEuropeElement); if (reply.getTagName().equals("recruitUnitInEuropeConfirmed")) { ! Unit unit = new Unit(game, (Element) reply.getChildNodes().item(0)); europe.recruit(slot, unit, Integer.parseInt(reply.getAttribute("newRecruitable"))); } else { --- 1977,1987 ---- Element reply = client.ask(recruitUnitInEuropeElement); if (reply.getTagName().equals("recruitUnitInEuropeConfirmed")) { ! Element unitElement = (Element) reply.getChildNodes().item(0); ! Unit unit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (unit == null) { ! unit = new Unit(game, unitElement); ! } else { ! unit.readFromXMLElement(unitElement); ! } europe.recruit(slot, unit, Integer.parseInt(reply.getAttribute("newRecruitable"))); } else { *************** *** 2000,2004 **** } ! Unit unit = new Unit(game, (Element) reply.getChildNodes().item(0)); int newRecruitable = Integer.parseInt(reply.getAttribute("newRecruitable")); europe.emigrate(slot, unit, newRecruitable); --- 2023,2033 ---- } ! Element unitElement = (Element) reply.getChildNodes().item(0); ! Unit unit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (unit == null) { ! unit = new Unit(game, unitElement); ! } else { ! unit.readFromXMLElement(unitElement); ! } int newRecruitable = Integer.parseInt(reply.getAttribute("newRecruitable")); europe.emigrate(slot, unit, newRecruitable); Index: InGameInputHandler.java =================================================================== RCS file: /cvsroot/freecol/freecol/src/net/sf/freecol/client/control/InGameInputHandler.java,v retrieving revision 1.63 retrieving revision 1.64 diff -C2 -d -r1.63 -r1.64 *** InGameInputHandler.java 30 Aug 2006 20:21:30 -0000 1.63 --- InGameInputHandler.java 25 Sep 2006 08:32:10 -0000 1.64 *************** *** 257,261 **** throw new NullPointerException("unitElement == null"); } ! final Unit unit = new Unit(game, unitElement); if (game.getFreeColGameObject(tileID) == null) { --- 257,267 ---- throw new NullPointerException("unitElement == null"); } ! Unit u = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (u == null) { ! u = new Unit(game, unitElement); ! } else { ! u.readFromXMLElement(unitElement); ! } ! final Unit unit = u; if (game.getFreeColGameObject(tileID) == null) { *************** *** 303,307 **** throw new NullPointerException("unitElement == null"); } ! unit = new Unit(game, unitElement); unit.setLocation(unit.getTile()); if (unit.getTile() == null) { --- 309,318 ---- throw new NullPointerException("unitElement == null"); } ! unit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (unit == null) { ! unit = new Unit(game, unitElement); ! } else { ! unit.readFromXMLElement(unitElement); ! } unit.setLocation(unit.getTile()); if (unit.getTile() == null) { *************** *** 320,325 **** logger.warning("defenderElement == null"); throw new NullPointerException("defenderElement == null"); ! } ! defender = new Unit(game, defenderElement); defender.setLocation(defender.getTile()); --- 331,341 ---- logger.warning("defenderElement == null"); throw new NullPointerException("defenderElement == null"); ! } ! defender = (Unit) game.getFreeColGameObject(defenderElement.getAttribute("ID")); ! if (defender == null) { ! defender = new Unit(game, defenderElement); ! } else { ! defender.readFromXMLElement(defenderElement); ! } defender.setLocation(defender.getTile()); *************** *** 673,677 **** for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! Unit newUnit = new Unit(freeColClient.getGame(), unitElement); player.getEurope().add(newUnit); } --- 689,698 ---- for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! Unit newUnit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (newUnit == null) { ! newUnit = new Unit(game, unitElement); ! } else { ! newUnit.readFromXMLElement(unitElement); ! } player.getEurope().add(newUnit); } *************** *** 852,857 **** unitList = element.getChildNodes(); for (int i = 0; i < unitList.getLength(); i++) { ! Element unitElement = (Element) unitList.item(i); ! newUnit = new Unit(game, unitElement); tile.add(newUnit); } --- 873,883 ---- unitList = element.getChildNodes(); for (int i = 0; i < unitList.getLength(); i++) { ! Element unitElement = (Element) unitList.item(i); ! newUnit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (newUnit == null) { ! newUnit = new Unit(game, unitElement); ! } else { ! newUnit.readFromXMLElement(unitElement); ! } tile.add(newUnit); } *************** *** 865,869 **** for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! newUnit = new Unit(game, unitElement); tile.add(newUnit); } --- 891,900 ---- for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! newUnit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (newUnit == null) { ! newUnit = new Unit(game, unitElement); ! } else { ! newUnit.readFromXMLElement(unitElement); ! } tile.add(newUnit); } *************** *** 875,879 **** for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! newUnit = new Unit(game, unitElement); player.getEurope().add(newUnit); } --- 906,915 ---- for (int i = 0; i < unitList.getLength(); i++) { Element unitElement = (Element) unitList.item(i); ! newUnit = (Unit) game.getFreeColGameObject(unitElement.getAttribute("ID")); ! if (newUnit == null) { ! newUnit = new Unit(game, unitElement); ! } else { ! newUnit.readFromXMLElement(unitElement); ! } player.getEurope().add(newUnit); } Index: ConnectController.java =================================================================== RCS file: /cvsroot/freecol/freecol/src/net/sf/freecol/client/control/ConnectController.java,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** ConnectController.java 10 Aug 2006 12:58:38 -0000 1.33 --- ConnectController.java 25 Sep 2006 08:32:10 -0000 1.34 *************** *** 6,9 **** --- 6,11 ---- import java.io.FileNotFoundException; import java.io.IOException; + import java.io.PrintWriter; + import java.io.StringWriter; import java.net.ConnectException; import java.util.ArrayList; *************** *** 12,15 **** --- 14,19 ---- import javax.swing.SwingUtilities; + import javax.xml.stream.XMLStreamReader; + import javax.xml.stream.XMLStreamWriter; import net.sf.freecol.FreeCol; *************** *** 190,227 **** freeColClient.setClient(client); ! Element element = Message.createNewRootElement("login"); ! element.setAttribute("username", username); ! element.setAttribute("freeColVersion", FreeCol.getVersion()); ! ! Element reply = client.ask(element); ! String type = reply.getTagName(); ! ! if (type.equals("loginConfirmed")) { ! Game game = new Game(freeColClient.getModelController(), (Element) reply.getElementsByTagName(Game.getXMLElementTagName()).item(0), username); ! Player thisPlayer = game.getPlayerByName(username); ! freeColClient.setGame(game); ! freeColClient.setMyPlayer(thisPlayer); ! // If (true) --> reconnect ! if (reply.hasAttribute("startGame") && Boolean.valueOf(reply.getAttribute("startGame")).booleanValue()) { ! freeColClient.setSingleplayer(false); ! freeColClient.getPreGameController().startGame(); ! if (Boolean.valueOf(reply.getAttribute("isCurrentPlayer")).booleanValue()) { ! freeColClient.getInGameController().setCurrentPlayer(thisPlayer); } ! } ! } else if (type.equals("error")) { ! if (reply.hasAttribute("messageID")) { ! canvas.errorMessage(reply.getAttribute("messageID"), reply.getAttribute("message")); } else { ! canvas.errorMessage(null, reply.getAttribute("message")); } - - return false; - } else { - logger.warning("Unkown message received: " + reply); - return false; } --- 194,248 ---- freeColClient.setClient(client); ! Connection c = client.getConnection(); ! XMLStreamReader in = null; ! try { ! XMLStreamWriter out = c.ask(); ! out.writeStartElement("login"); ! out.writeAttribute("username", username); ! out.writeAttribute("freeColVersion", FreeCol.getVersion()); ! out.writeEndElement(); ! in = c.getReply(); ! if (in.getLocalName().equals("loginConfirmed")) { ! final String startGameStr = in.getAttributeValue(null, "startGame"); ! boolean startGame = (startGameStr != null) && Boolean.valueOf(startGameStr).booleanValue(); ! boolean isCurrentPlayer = Boolean.valueOf(in.getAttributeValue(null, "isCurrentPlayer")).booleanValue(); ! ! in.nextTag(); ! Game game = new Game(freeColClient.getModelController(), in, username); ! Player thisPlayer = game.getPlayerByName(username); ! freeColClient.setGame(game); ! freeColClient.setMyPlayer(thisPlayer); ! // If (true) --> reconnect ! if (startGame) { ! freeColClient.setSingleplayer(false); ! freeColClient.getPreGameController().startGame(); ! if (isCurrentPlayer) { ! freeColClient.getInGameController().setCurrentPlayer(thisPlayer); ! } } ! c.endTransmission(in); ! } else if (in.getLocalName().equals("error")) { ! canvas.errorMessage(in.getAttributeValue(null, "messageID"), in.getAttributeValue(null, "message")); ! ! c.endTransmission(in); ! return false; } else { ! logger.warning("Unkown message received: " + in.getLocalName()); ! c.endTransmission(in); ! return false; ! } ! } catch (Exception e) { ! StringWriter sw = new StringWriter(); ! e.printStackTrace(new PrintWriter(sw)); ! logger.warning(sw.toString()); ! canvas.errorMessage(null, "Could not send XML to the server."); ! try { ! c.endTransmission(in); ! } catch (IOException ie) { ! logger.warning("Exception while trying to end transmission: " + ie.toString()); } } *************** *** 296,313 **** FreeColServer freeColServer = null; ! try { freeColServer = new FreeColServer( theFile, port ); freeColClient.setFreeColServer( freeColServer ); - final String username = freeColServer.getOwner(); - freeColClient.setSingleplayer( freeColServer.isSingleplayer() ); SwingUtilities.invokeLater( new Runnable() { public void run() { ! login( username, "127.0.0.1", 3541 ); canvas.closeStatusPanel(); } ! } ); } catch ( FileNotFoundException e ) { --- 317,332 ---- FreeColServer freeColServer = null; ! try { freeColServer = new FreeColServer( theFile, port ); freeColClient.setFreeColServer( freeColServer ); final String username = freeColServer.getOwner(); freeColClient.setSingleplayer( freeColServer.isSingleplayer() ); SwingUtilities.invokeLater( new Runnable() { public void run() { ! login( username, "127.0.0.1", 3541 ); canvas.closeStatusPanel(); } ! } ); } catch ( FileNotFoundException e ) { *************** *** 331,335 **** } }; ! freeColClient.worker.schedule( loadGameJob ); } --- 350,354 ---- } }; ! freeColClient.worker.schedule( loadGameJob ); } Index: PreGameController.java =================================================================== RCS file: /cvsroot/freecol/freecol/src/net/sf/freecol/client/control/PreGameController.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** PreGameController.java 28 Jan 2006 12:29:28 -0000 1.22 --- PreGameController.java 25 Sep 2006 08:32:10 -0000 1.23 *************** *** 265,269 **** } else { canvas.setEnabled(false); ! canvas.showStatusPanel(Messages.message("waitingForOtherPlayers")); } } --- 265,269 ---- } else { canvas.setEnabled(false); ! canvas.showStatusPanel(Messages.message("waitingForOtherPlayers")); } } |