home *** CD-ROM | disk | FTP | other *** search
/ BUG 15 / BUGCD1998_06.ISO / aplic / jbuilder / jsamples.z / SendThread.java < prev    next >
Text File  |  1997-07-03  |  29KB  |  894 lines

  1. package borland.samples.apps.chess.server;
  2.  
  3. import java.net.*;
  4. import java.io.*;
  5. import java.util.*;
  6. import borland.samples.apps.chess.client.ServerMessage;
  7. import borland.samples.apps.chess.client.PersistString;
  8.  
  9. class SendThread extends Thread {
  10.   ServerSocket serverSocket = null;
  11.   String socketnum;
  12.   int portnum;
  13.   PlayerId name;
  14.   GameLibrary library = null;
  15.   String outputLine;
  16.   private Vector msgque = null;
  17.   Vector suspendList = null;
  18.   Game game = null;
  19.   boolean isPlaying = false;
  20.   //PrintStream os ;
  21.   PrintWriter os ;
  22.   SendThread opponent = null;
  23.   SendThread token = null;
  24.  
  25.   SendThread(int port) {
  26.     outputLine = "?";
  27.     try {
  28.       portnum = port;
  29.       socketnum =  String.valueOf(port);
  30.       serverSocket = new ServerSocket(port);
  31.       msgque = new Vector(5,5);
  32.       //System.out.println("MHello1");
  33.     }
  34.     catch (IOException e) {
  35.       System.out.println("Could not listen on port: " + 4444 + ", " + e);
  36.       System.exit(1);
  37.     }
  38.   }
  39.  
  40.   void handleBye(ServerMessage smsg) {
  41.     if (game == null) {
  42.       if (name != null ) {
  43.         System.out.println(name.user + "was not playing") ;
  44.         ChessServer.playerlist.remove(name.user);
  45.       }
  46.     }
  47.     else  {
  48.       if (isPlaying)
  49.         SuspendGame();
  50.       if (game.RemoveObserver(this)) //if last observer of the game
  51.         ChessServer.gamelist.remove(game.getPlayers());   //remove yourself
  52.       if (opponent == null) {
  53.         System.out.println(name.user + "was playing, but game over/suspended") ;
  54.         if (token != null)
  55.           token.addMsg(portnum,"Token",name.user + ": parting");
  56.       }
  57.       else
  58.         opponent.addMsg(portnum,"Token",name.user + ": parting...");
  59.  
  60.       ChessServer.playerlist.remove(name.user);
  61.       game = null;
  62.       token = null;
  63.       isPlaying = false;
  64.     }
  65.   }
  66.   void addMsg(int portnum,String msgid,String msg) {
  67.     addMsg(new ServerMessage(portnum,msgid,msg));
  68.   }
  69.   synchronized void addMsg(ServerMessage msg) {
  70.     msgque.addElement(msg);
  71.     notify();
  72.   }
  73.   void handleMove(ServerMessage smsg) {
  74.     smsg.msgid = "Moved";
  75.     if (opponent != null) {
  76.       opponent.addMsg(smsg);
  77.       //synchronized (opponent) {
  78.       //  opponent.msgque.addElement(smsg);
  79.       //     opponent.notify();
  80.       //}
  81.     }
  82.     game.AddMove(smsg);
  83.   }
  84.  
  85.   void handleInfo(ServerMessage smsg) {
  86.     PlayerId p = (PlayerId) PlayerId.usersByUser.get(smsg.msg);
  87.     if (p != null) {
  88.       String temp = p.password;
  89.       if (smsg.msgid.equals("Info"))
  90.         p.password = " ";
  91.       os.println(smsg.msgid + " " + p.Output());
  92.       os.flush();
  93.       p.password = temp;
  94.     }
  95.     else
  96.       System.out.println("Don't know " + smsg.msg);
  97.   }
  98.  
  99.   void handleUpdateInfo(ServerMessage smsg) {
  100.     String oldId = name.id;
  101.     String oldUser = name.user;
  102.     int oldRating = name.rating;
  103.     int oldGamesPlayed = name.gamesPlayed;
  104.     name.read(smsg.msg);
  105.     name.id = oldId;
  106.     name.user = oldUser;
  107.     name.rating = oldRating;
  108.     name.gamesPlayed = oldGamesPlayed;
  109.     name.isDirty();
  110.   }
  111.  
  112.   void handleSuspend(ServerMessage smsg) {
  113.     SuspendGame();
  114.     if (opponent != null)
  115.       opponent.addMsg(portnum,"Token",name.user + ": parted");
  116.       //synchronized (opponent) {
  117.       //  opponent.msgque.addElement((new ServerMessage(portnum,"Token",name.user + ": parted")));
  118.       //  opponent.notify();
  119.       //}
  120.     opponent = null;
  121.     token = null;
  122.     isPlaying = false;
  123.   }
  124.  
  125.   //Offer draw or abort
  126.   void handleOffers(ServerMessage smsg) {
  127.     if (smsg.port != portnum)  {
  128.       os.println(smsg.msgid);
  129.       os.flush();
  130.     }
  131.     else {
  132.       if (opponent != null) {
  133.         opponent.addMsg(smsg);
  134.         //synchronized (opponent) {
  135.        //      opponent.msgque.addElement(smsg);
  136.            //  opponent.notify();
  137.         //}
  138.       }
  139.       System.out.println("remembering the offer until it is refused");
  140.       //gameover takes care of itself
  141.       int offer = Game.DrawOffer;
  142.       if (smsg.msg.equals("OfferAbort"))
  143.         offer = Game.AbortOffer;
  144.       game.setOffer(name.user,offer);
  145.     }
  146.   }
  147.   void handleNote(ServerMessage smsg) {
  148.     handleNote(PersistString.parse(smsg.msg));
  149.   }
  150.   void handleNote(String msgData[]) {
  151.     System.out.println("handle note: is " + msgData[0] + "logged on?");
  152.     SendThread recipient = null;
  153.     if (ChessServer.playerlist.containsKey(msgData[0]))
  154.       recipient = (SendThread)ChessServer.playerlist.get(msgData[0]);
  155.     if (recipient != null) {
  156.       recipient.addMsg(portnum,"Chat",msgData[1]);
  157.       //synchronized (recipient) {
  158.       //  recipient.msgque.addElement(new ServerMessage(portnum,"Chat",msgData[1]));
  159.       //  recipient.notify();
  160.       //}
  161.     }
  162.     else   {
  163.       System.out.println("look in dataset for " + msgData[0]);
  164.       PlayerId toPlayer = (PlayerId)PlayerId.usersByUser.get(msgData[0]);
  165.       if (toPlayer == null)
  166.         System.out.println(msgData[0] + "is not in the hashtable??");
  167.       else {
  168.         System.out.println("add message to player " + toPlayer.name);
  169.         toPlayer.addNote(msgData[1]);
  170.         
  171.       }
  172.     }
  173.   }
  174.   void handleChat(ServerMessage smsg) {
  175.     if (smsg.port != portnum)  {
  176.       System.out.println("ST report Chat" );
  177.       os.println(smsg.msgid + " " + smsg.msg);
  178.       os.flush();
  179.     }
  180.     else
  181.       if (isPlaying) {
  182.         if (opponent == null) {
  183.           System.out.println("ST opponent Note" );
  184.           if (game != null) {
  185.             String [] msgData = new String[2];
  186.             msgData[0] = game.white;
  187.             if (game.white.equals(name.user))
  188.               msgData[0] = game.black;
  189.             msgData[1] =  smsg.msg;
  190.             handleNote(msgData);
  191.           }
  192.           else
  193.             System.out.println("handleChat: isPlaying but game is null??");
  194.         }
  195.         else {
  196.           System.out.println("ST opponent Chat" );
  197.           os.println(smsg.msgid+" "+smsg.msg);
  198.           os.flush();
  199.           opponent.addMsg(smsg);
  200.          // synchronized (opponent) {
  201.          //   opponent.msgque.addElement(smsg);
  202.          //   opponent.notify();
  203.           //}
  204.         }
  205.       }
  206.       else {
  207.         if (game != null) {
  208.           System.out.println("ST group Chat" );
  209.           game.Chat(smsg);
  210.         }
  211.         else  {
  212.           System.out.println("Broadcast chat?");
  213.           Enumeration e = ChessServer.playerlist.elements();
  214.           while (e.hasMoreElements()) {
  215.             SendThread t = (SendThread) e.nextElement();
  216.             if (!t.isPlaying && t != this)
  217.             t.addMsg(smsg);
  218.             //synchronized (t) {
  219.             //  t.msgque.addElement(smsg);
  220.             //  t.notify();
  221.             //}
  222.           }
  223.           os.println(smsg.msgid+" "+smsg.msg);
  224.           os.flush();
  225.         }
  226.       }
  227.   }
  228.  
  229.   void handleResign(ServerMessage smsg) {
  230.     if (smsg.port != portnum) {
  231.       os.println(smsg.msgid + " " +smsg.msg);
  232.       os.flush();
  233.     }
  234.     else  {
  235.       smsg.msgid= ("Resigned");
  236.       if (opponent != null)
  237.         opponent.addMsg(smsg);
  238.         //synchronized (opponent) {
  239.         //  opponent.msgque.addElement(smsg);
  240.         //  opponent.notify();
  241.        // }
  242.       RecordResult(smsg.msg);
  243.     }
  244.   }
  245.  
  246.   void handleTokenMove(ServerMessage smsg) {
  247.     if (smsg.port != portnum) {
  248.       os.println(smsg.msgid + " " + smsg.msg);
  249.       os.flush();
  250.     }
  251.     else
  252.       if (token != null)
  253.         token.addMsg(smsg);
  254.         //synchronized (token) {
  255.         //  token.msgque.addElement(smsg);
  256.            //  token.notify();
  257.         //}
  258.   }
  259.  
  260.   void handleGameAccept(ServerMessage smsg) {
  261.     //PlayerId temp = null;
  262.     if (game != null)
  263.       if (game.RemoveObserver(this))
  264.         ChessServer.gamelist.remove(game.getPlayers());
  265.     isPlaying = true;
  266.     if (smsg.msgid.equals("GameAccept")) {
  267.       if (token != null && token != opponent)
  268.         token.addMsg(portnum,"Token",name.user + ": parted.");
  269.         //synchronized (token) {
  270.         //  token.msgque.addElement((new ServerMessage(portnum,"Token",name.user + ": parted.")));
  271.         //  token.notify();
  272.         //}
  273.       token = opponent;
  274.       if (opponent.token != null && opponent.token != this)
  275.         opponent.addMsg(portnum,"Token",name.user + ": parted..");
  276.        // synchronized (opponent.token) {
  277.        //   opponent.token.msgque.addElement((new ServerMessage(portnum,"Token",name.user + ": parted..")));
  278.         //  opponent.token.notify();
  279.         //}
  280.       opponent.token = this;
  281.       String [] parm = PersistString.parse(smsg.msg);
  282.       //int index = smsg.msg.indexOf(' ');
  283.       //String color = smsg.msg.substring(0,index);
  284.       String color = parm[0];
  285.       if (color.equals("white")) {
  286.         //iswhite = true;
  287.         game = new Game(name.user,opponent.name.user);
  288.       }
  289.       else   {
  290.         //iswhite = false;
  291.         game = new Game(opponent.name.user,name.user);
  292.       }
  293.       game.moveTime = parm[1];
  294.       ChessServer.gamelist.put(game.getPlayers(),game);
  295.       smsg.msgid= ("GameAccepted");
  296.       opponent.addMsg(smsg);
  297.       //synchronized (opponent) {
  298.       //  opponent.msgque.addElement(smsg);
  299.       //  opponent.notify();
  300.       //}
  301.     }
  302.     else { //tell the criginator the good news
  303.       game = opponent.game;//both reference the same game
  304.       os.println(smsg.msgid + " " + smsg.msg);
  305.       os.flush();
  306.     }
  307.   }
  308.  
  309.   void handleAccepts(ServerMessage smsg) {
  310.     if (smsg.port != portnum) {
  311.       os.println(smsg.msgid);
  312.       os.flush();
  313.     }
  314.     else {
  315.       if (opponent != null)
  316.         opponent.addMsg(smsg);
  317.        // synchronized (opponent) {
  318.        //      opponent.msgque.addElement(smsg);
  319.        //   opponent.notify();
  320.        // }
  321.       RecordResult(smsg.msg);
  322.     }
  323.   }
  324.  
  325.   void handleName(ServerMessage smsg) {
  326.     System.out.println("MS"  + socketnum + " Name " + smsg.msg);
  327.     if (isGoodLogon(smsg.msg)) {
  328.       os.println("Welcome");
  329.       os.flush();
  330.       //deliver messages , if any
  331.       int count =  name.message.size();
  332.       if (count > 0) {
  333.         for (int i=0;i<count;i++) {
  334.           os.println("Chat " + name.message.elementAt(i));
  335.           os.flush();
  336.         }
  337.         name.message.removeAllElements();
  338.         name.isDirty();
  339.       }
  340.     }  
  341.     else {
  342.       os.println("Status Password did not match - try again");
  343.       os.flush();
  344.     }
  345.   }
  346.  
  347.   void handleChallenges(ServerMessage smsg) {
  348.     if (smsg.msgid.equals("Challenge")) {
  349.       String msgData[] = PersistString.parse(smsg.msg);
  350.       if (!isPlaying) { //is someone challenging you?
  351.         isPlaying = true; // so nobody else will challenge them
  352.         //int index = smsg.msg.indexOf(' ');
  353.         //index = smsg.msg.indexOf(' ',index+1);
  354.         //String key = smsg.msg.substring(index+1);
  355.         //PlayerId opp = (PlayerId)PlayerId.usersByUser.get(key);
  356.         opponent = (SendThread)ChessServer.playerlist.get(msgData[2]);
  357.         //key = smsg.msg.substring(0,index+1);
  358.         if (opponent.isPlaying) { //did someone else get them first?
  359.           System.out.println(name + "Challenged " + msgData[2] + ",but they are not available");
  360.           os.println("Status Not Available");
  361.           os.flush();
  362.         }
  363.         else     {
  364.           opponent.isPlaying = true;
  365.           os.println("Status Challenged " + opponent.name.user);
  366.           os.flush();
  367.           String[] parameter = new String[6];
  368.           parameter[0] = msgData[0]; //time per game
  369.           parameter[1] = msgData[1]; //added time per move
  370.           parameter[2] = name.user; //challenger
  371.           parameter[3] = String.valueOf(name.rating);  //challenger rating
  372.           parameter[4] = opponent.name.user; //challengee
  373.           parameter[5] = String.valueOf(opponent.name.rating); //challengee rating
  374.           smsg.msg =  PersistString.concat(parameter);
  375.           smsg.msgid = "Challenged";
  376.           //smsg.msg = key + name.user;
  377.           opponent.opponent = this;
  378.           opponent.addMsg(smsg);
  379.           //synchronized (opponent) {
  380.             //opponent.msgque.addElement(smsg);
  381.             //opponent.opponent = this;
  382.             //opponent.notify();
  383.           //}
  384.            }
  385.       }
  386.       //else do nothing - you are about to be challenged
  387.     }
  388.     else {
  389.       os.println(smsg.msgid + " " + smsg.msg);
  390.       os.flush();
  391.     }
  392.   }
  393.  
  394.   void handleRefuseChallenge(ServerMessage smsg) {
  395.     smsg.msgid = "RefusedChallenge";
  396.     isPlaying = false;
  397.     if (opponent != null)
  398.       opponent.addMsg(smsg);
  399.       //synchronized (opponent) {
  400.       //  opponent.msgque.addElement(smsg);
  401.       //  opponent.notify();
  402.       //}
  403.     opponent = null;
  404.   }
  405.  
  406.   void handleRefused(ServerMessage smsg)   {
  407.     game.setOffer(name.user,0);
  408.     if (smsg.port != portnum) {
  409.       os.println(smsg.msgid);
  410.       os.flush();
  411.     }
  412.     else {
  413.       if (opponent != null)
  414.         opponent.addMsg(smsg);
  415.         //synchronized (opponent) {
  416.         //  opponent.msgque.addElement(smsg);
  417.         //  opponent.notify();
  418.         //}
  419.     }
  420.   }
  421.  
  422.   void handleRefusedChallenge(ServerMessage smsg)     {
  423.     //ChessServer.playerlist.put(name.user,this);
  424.     isPlaying = false;
  425.     opponent = null;
  426.     os.println("Refused " + smsg.msg);
  427.     os.flush();
  428.     System.out.println("refused");
  429.   }
  430.  
  431.   void handleResume(ServerMessage smsg) {
  432.     int index = Integer.parseInt(smsg.msg);
  433.     game = (Game)suspendList.elementAt(index);
  434.     if (game == null)
  435.       os.println("Status Can't find the game?!");
  436.     else {
  437.       game.GameResumed();
  438.  
  439.       if (game.isOver()) {
  440.         game.Kibitzer.addElement(this);
  441.         isPlaying = false;
  442.       }
  443.       else
  444.         isPlaying = true;
  445.       String opp = game.white;
  446.       System.out.println("Resuming " + game);
  447.       if (game.white.equals(name.user))
  448.         opp = game.black;
  449.       SendThread myopp = (SendThread) ChessServer.playerlist.get(opp);
  450.       if (myopp != null)  {
  451.         if ( myopp.game == game){
  452.           //if ( myopp.opponent == this) {
  453.             myopp.opponent = this;
  454.             opponent = myopp;
  455.             System.out.println("joining the suspended game");
  456.           //}
  457.           //else
  458.           //  System.out.println("Other player is still suspended" + myopp.opponent);
  459.         }
  460.         else
  461.           System.out.println("Other player is looking at game " + myopp.game + " not " + game);
  462.       }
  463.       else
  464.         System.out.println("Other player is not logged on") ;
  465.       os.println("Resume " + game.getMoves());
  466.       os.flush();
  467.       System.out.println("Resume " + game.getMoves());
  468.       String offer;
  469.       if ((offer = game.getOffer(name.user)) != null) {
  470.         os.println(offer);
  471.         os.flush();
  472.       }
  473.       if (token != null && token != opponent)
  474.         token.addMsg(portnum,"Token",name.user + ": parted...");
  475.         //synchronized (token) {
  476.         //  token.msgque.addElement((new ServerMessage(portnum,"Token",name.user + ": parted...")));
  477.         //  token.notify();
  478.         //}
  479.       token = null;
  480.       if (opponent == null) {
  481.         if (ChessServer.gamelist.get(game.getPlayers())== null)
  482.           ChessServer.gamelist.put(game.getPlayers(),game);
  483.       }
  484.       else  {
  485.         token = opponent;
  486.         opponent.opponent = this;
  487.         opponent.token = this;
  488.         os.println("Chat " + opponent.name.user + ": joins");
  489.         os.flush();
  490.         opponent.addMsg(portnum,"Chat",name.user + ": joins");
  491.         //synchronized (opponent) {
  492.         //  opponent.msgque.addElement((new ServerMessage(portnum,"Chat",name.user + ": joins")));
  493.         //  opponent.notify();
  494.         //}
  495.       }
  496.     }
  497.   }
  498.  
  499.   void handleWatching(ServerMessage smsg)  {
  500.     if (game != null)
  501.       if (game.RemoveObserver(this))
  502.         ChessServer.gamelist.remove(game.getPlayers());
  503.     System.out.println("MS process Watching");
  504.     game = (Game)ChessServer.gamelist.get(smsg.msg);
  505.     if (game != null)
  506.       game.AddObserver(this);
  507.     else
  508.       System.out.println("MS game is null for" + name.user);
  509.   }
  510.  
  511.   public void run() {
  512.     System.out.println("MS running" + socketnum);
  513.     if (serverSocket == null)
  514.       return;
  515.     Socket clientSocket = null;
  516.     try {
  517.       clientSocket = serverSocket.accept();
  518.     }
  519.     catch (IOException e) {
  520.       System.out.println("Accept failed: " + 1957 + ", " + e);
  521.       System.exit(1);
  522.     }
  523.     try {
  524.       //System.out.println("set up data streams");
  525.       new ListenThread(clientSocket,this).start();
  526.       os = new PrintWriter(clientSocket.getOutputStream());
  527.       //os = new PrintStream(new BufferedOutputStream(clientSocket.getOutputStream(), 1024), false);
  528.  
  529.       suspendList = new Vector(10);
  530.       String inputLine;
  531.       ServerMessage smsg;
  532.       String oldname;
  533.       System.out.println("ST Waiting for Stuff to do" + socketnum);
  534.       if (msgque == null)
  535.         System.out.println("ST null msgque?? - crash coming");
  536. alive: {
  537.       while (true) {
  538.         synchronized (this) {
  539.           if (msgque.isEmpty()) {
  540.             try {
  541.               System.out.println("ST waiting");
  542.               wait();
  543.             }
  544.             catch  (InterruptedException e){System.out.println("ST woke up");}
  545.           }
  546.           else
  547.             System.out.println("ST queued up");
  548.           smsg = (ServerMessage) msgque.firstElement();
  549.           System.out.println("ST msg" + String.valueOf(portnum) + String.valueOf(smsg.port) + smsg.msgid + " " + smsg.msg);
  550.           msgque.removeElementAt(0);
  551.         }
  552.         if (smsg.msgid.equals("Bye") || smsg.msgid.equals("dead")) {
  553.           handleBye(smsg);
  554.           if (smsg.msgid.equals("dead"))
  555.             break alive; //if they said bye, they can logon again
  556.         }
  557.         else
  558.         if (smsg.msgid.equals("Move"))
  559.           handleMove(smsg);
  560.       else
  561.         if (smsg.msgid.equals("Moved")) {
  562.           if (smsg.port != portnum) {
  563.             os.println(smsg.msgid + " " + smsg.msg);
  564.             os.flush();
  565.           }
  566.     }
  567.         else
  568.         if (smsg.msgid.startsWith("Info"))
  569.           handleInfo(smsg) ;
  570.         else
  571.         if (smsg.msgid.equals("UpdateInfo"))
  572.           handleUpdateInfo(smsg) ;
  573.         else
  574.         if (smsg.msgid.equals("MoveList")) {
  575.           os.println(smsg.msgid + " " + smsg.msg);
  576.       os.flush();
  577.     }
  578.         else
  579.         if (smsg.msgid.equals("TokenMove"))
  580.           handleTokenMove(smsg)  ;
  581.         else
  582.         if (smsg.msgid.equals("Suspend"))
  583.           handleSuspend(smsg) ;
  584.         else
  585.         if (smsg.msgid.equals("LibraryList")){
  586.           library = GameLibrary.getLibrary(null,null);
  587.           os.println("LibraryList " + library.getList());
  588.           os.flush();
  589.         }
  590.         else
  591.         if (smsg.msgid.equals("LogonList")){
  592.           os.println("PlayerList " + getInfoList());
  593.           os.flush();
  594.         }
  595.         else
  596.         if (smsg.msgid.equals("PlayerList")){
  597.  
  598.           //os.println("PlayerList " +
  599.           getPlayerList();
  600.           //os.flush();
  601.         }
  602.         else
  603.         if (smsg.msgid.equals("GetLibraryGame"))
  604.           getLibraryGame(smsg.msg);
  605.         else
  606.         if (smsg.msgid.equals("Token"))
  607.           OpponentParted(smsg);
  608.         else
  609.         if (smsg.msgid.equals("Name"))
  610.           handleName(smsg);
  611.         else
  612.         if (smsg.msgid.equals("List")) {
  613.           os.println(GetList());
  614.           os.flush();
  615.           System.out.println("MS"  + socketnum + " ListF:" );
  616.         }
  617.         else
  618.         if (smsg.msgid.startsWith("Offer"))
  619.           handleOffers(smsg);
  620.         else
  621.         if (smsg.msgid.equals("Chat"))
  622.           handleChat(smsg) ;
  623.         else
  624.         if (smsg.msgid.equals("Note"))
  625.           handleNote(smsg) ;
  626.     else
  627.         if (smsg.msgid.startsWith("Resign"))
  628.           handleResign(smsg)  ;
  629.         else
  630.         if (smsg.msgid.startsWith("GameAccept"))
  631.           handleGameAccept(smsg);
  632.         else
  633.         if (smsg.msgid.startsWith("Accept"))
  634.           handleAccepts(smsg);
  635.         else
  636.         if (smsg.msgid.startsWith("Challenge"))
  637.           handleChallenges(smsg);
  638.         else
  639.         if (smsg.msgid.equals("RefuseChallenge"))
  640.           handleRefuseChallenge(smsg);
  641.         else
  642.         if (smsg.msgid.equals("Refused"))
  643.           handleRefused(smsg)  ;
  644.         else
  645.         if (smsg.msgid.equals("RefusedChallenge"))
  646.           handleRefusedChallenge(smsg) ;
  647.         else
  648.         if (smsg.msgid.equals("Resume"))
  649.           handleResume(smsg) ;
  650.         else
  651.         if (smsg.msgid.equals("Watching"))
  652.           handleWatching(smsg) ;
  653.         else
  654.         if (smsg.msgid.equals("UpdateUser"))
  655.           UpdateUser(smsg.msg);
  656.     else
  657.           System.out.println("MS ignored " + smsg.msgid);
  658.           }
  659.       }
  660.       System.out.println("closing socket " + portnum);
  661.       if (name != null)
  662.         ChessServer.playerlist.remove(name.user) ;  //should be gone by now anyway
  663.       os.close();
  664.       clientSocket.close();
  665.     }
  666.     catch (IOException e) {
  667.       e.printStackTrace();
  668.     }
  669.     finally {
  670.       ChessServer.portIdle(portnum);
  671.       if (serverSocket != null) {
  672.         try {
  673.           serverSocket.close();
  674.         }
  675.         catch (IOException e) {
  676.           e.printStackTrace();
  677.         }
  678.         serverSocket = null;
  679.       }
  680.     }
  681.   }
  682.  
  683.   void SuspendGame() {
  684.     //Write the game to disk if on move 2 or more (need blacks move to get his time remaining)
  685.     if (game.GameSuspended())
  686.       ChessServer.gamelist.remove(game.getPlayers());
  687.     if (game.movenum > 1) {
  688.       if (game.filename == null) {
  689.         System.out.println("adding to suspend list: " + game);
  690.         suspendList.addElement(game);
  691.         //if (opponent != null)
  692.         //  opponent.suspendList.addElement(game);
  693.       }
  694.       PlayerId.SuspendGame(game);
  695.     }
  696.     game = null;
  697.   }
  698.  
  699.   String getInfoList() {
  700.     int playerCount = ChessServer.playerlist.size();
  701.     System.out.println("getInfoList -playercount = " + playerCount);
  702.     String[] dataArray = new String[playerCount * 3] ;
  703.     int i = 0;
  704.     for (Enumeration e = ChessServer.playerlist.elements() ; e.hasMoreElements() ;) {
  705.       SendThread np = (SendThread)e.nextElement();
  706.       //PlayerId player = (PlayerId)e.nextElement();
  707.       dataArray[i++] = String.valueOf(np.name.rating);
  708.       dataArray[i++] = np.name.user;
  709.       dataArray[i++] = np.name.name;
  710.     }
  711.     return PersistString.concat(dataArray);
  712.   }
  713.  
  714.   void getPlayerList() {
  715.     int userCount =   PlayerId.usersByUser.size();
  716.     System.out.println("getPlayerList playerCount=" + userCount);
  717.  
  718.     Enumeration e = PlayerId.usersByUser.elements();
  719.     while (e.hasMoreElements()) {
  720.       int count = userCount;
  721.       if (userCount > 30)
  722.       count = 30;
  723.       String[] dataArray = new String[count * 3] ;
  724.       int i = 0;
  725.       for ( ; e.hasMoreElements() && i < 30;) {
  726.         PlayerId player = (PlayerId)e.nextElement();
  727.         dataArray[i++] = String.valueOf(player.rating);
  728.         dataArray[i++] = player.user;
  729.         dataArray[i++] = player.name;
  730.         userCount--;
  731.       }
  732.       os.println("PlayerList " + PersistString.concat(dataArray));
  733.       os.flush();
  734.       yield();
  735.     }
  736.   }
  737.  
  738.   String GetList()   {
  739.     String outputLine = "List ";
  740.     SendThread np;
  741.     Game g;
  742.     for (Enumeration e = suspendList.elements() ; e.hasMoreElements() ;) {
  743.       g = (Game)e.nextElement();
  744.       outputLine = outputLine + 'G' + g.toString() + '?';
  745.     }
  746.     //System.out.println("MS"  + socketnum + " ListA:" );
  747.     for (Enumeration e = ChessServer.playerlist.elements() ; e.hasMoreElements() ;) {
  748.       np = (SendThread)e.nextElement();
  749.       if (np.isPlaying == false)
  750.         outputLine = outputLine + 'P' + np.name.user + " " + np.name.rating + '?';
  751.     }
  752.     //System.out.println("MS"  + socketnum + " ListA:" );
  753.     for (Enumeration e = ChessServer.gamelist.elements() ; e.hasMoreElements() ;)  {
  754.       g = (Game)e.nextElement();
  755.       //if (np != null )  {
  756.         if (g.white.equals(name.user) || g.black.equals(name.user));
  757.         else
  758.           outputLine = outputLine + 'A' + g.toString() + '?';
  759.       //}
  760.     }
  761.     return outputLine;
  762.   }
  763.  
  764.   void getLibraryGame(String games) {
  765.     if (game != null)
  766.       if (game.RemoveObserver(this))
  767.         ChessServer.gamelist.remove(game.getPlayers());
  768.     int index = 0;
  769.     int endindex = games.lastIndexOf('?');
  770.     GameLibrary temp = library;
  771.     while (index < endindex && temp == library) {
  772.       int nextindex = games.indexOf('?',index);
  773.       if (nextindex == -1)
  774.         nextindex = endindex;
  775.       String gameName = games.substring(index,nextindex);
  776.       temp = GameLibrary.getLibrary(gameName,library);
  777.       System.out.println("getting game " +  index + " " + nextindex + " " + gameName);
  778.       if (temp == library)
  779.         os.println("LibraryGame " + gameName + "?" + temp.getGame(gameName));
  780.       else
  781.         os.println("LibraryList " +   temp.getList());
  782.       os.flush();
  783.       index = nextindex + 1;
  784.     }
  785.     library = temp;
  786.   }
  787.  
  788.   protected void OpponentParted(ServerMessage msg) {
  789.     os.println(msg.msgid );
  790.     os.flush();
  791.     os.println("Chat " + msg.msg);
  792.     os.flush();
  793.     //String oppName = token.name.user;
  794.     System.out.println("OpponentParted " + msg.msg ) ;
  795.     opponent = null;
  796.     token = null;
  797.     game.Chat(new ServerMessage(msg.port,"Chat",msg.msg));
  798.   }
  799.  
  800.   protected void RecordResult(String result) {
  801.     if (game != null) {
  802.       game.GameOver(result);
  803.       ServerMessage msg = new ServerMessage(portnum,"Chat",name.user + " joins");
  804.       game.Chat(msg);
  805.       game.Kibitzer.addElement(this);
  806.  
  807.       if (opponent != null) {
  808.         ServerMessage smsg = new ServerMessage(portnum,"Chat",opponent.name.user + " joins");
  809.         game.Chat(smsg);
  810.         game.Kibitzer.addElement(opponent) ;
  811.         opponent.isPlaying = false;
  812.         //opponent.iswhite = false;
  813.         opponent.opponent = null;
  814.         if (game.filename != null)
  815.           opponent.suspendList.removeElement(game);
  816.       }
  817.       PlayerId.RecordResult(game,result) ;
  818.       if (game.filename != null)
  819.         suspendList.removeElement(game);
  820.       opponent = null;
  821.       isPlaying = false;
  822.     }
  823.     else
  824.       System.out.println("ST tried to record result");
  825.   }
  826.  
  827.   void UpdateUser(String msg) {
  828.     int index = msg.indexOf('[');
  829.     String password = msg.substring(0,index);
  830.     int index1 = msg.indexOf(index+1,'[');
  831.     String email = msg.substring(index+1,index1);
  832.     index =  msg.indexOf(index1+1,'[');
  833.     String name = msg.substring(index1+1,index);
  834.     index1 = msg.indexOf(index+1,'[');
  835.     String location = msg.substring(index+1,index1);
  836.     String extra = msg.substring(index1+1);
  837.     this.name.Update(password,email,name,location,extra);
  838.   }
  839.  
  840.   boolean isGoodLogon(String msg){
  841.     int index = msg.indexOf('[');
  842.     String password = msg.substring(index +1).trim();
  843.     String user = msg.substring(0,index).trim();
  844.     PlayerId p = (PlayerId) PlayerId.usersByUser.get(user);
  845.     if (p == null) {
  846.       System.out.println("Adding " + user + " " + password);
  847.       name = new PlayerId( user,password);
  848.       name.addPlayer();
  849.     }
  850.     else
  851.     if (p.password.equals(password)) {
  852.       name = p;
  853.       for ( Enumeration e = p.partialGame.elements();e.hasMoreElements();){
  854.         String filename = (String) e.nextElement();
  855.         if (!UseLoggedOnOpponentsGame(filename)) {
  856.           System.out.println("adding to " + name.user + " suspended list " + filename);
  857.           Game g = p.getGame(filename);
  858.           if (g != null)
  859.             suspendList.addElement(g);
  860.         }
  861.       }
  862.     }
  863.     else
  864.       return false;
  865.     ChessServer.playerlist.put((Object)user,(Object)this);
  866.     return true;
  867.   }
  868.  
  869.   boolean UseLoggedOnOpponentsGame(String filename) {
  870.     PlayerId opp = (PlayerId) PlayerId.usersById.get(filename.substring(0,4));
  871.     if (opp != null)
  872.       if (opp.user.equals(name.user))
  873.         opp = (PlayerId) PlayerId.usersById.get(filename.substring(4,8));
  874.     if (opp == null) {
  875.       System.out.println("Somebody disappeared from the user list!");
  876.       return false ; //can't fix it ,show game to get a clue
  877.     }
  878.     SendThread pastOpponent = (SendThread) ChessServer.playerlist.get(opp.user);
  879.     if (pastOpponent == null)
  880.       return false;
  881.     Game g;
  882.     for (Enumeration e = pastOpponent.suspendList.elements() ; e.hasMoreElements() ;) {
  883.       g = (Game)e.nextElement();
  884.       if (g.filename.equals(filename)) {
  885.          suspendList.addElement(g);
  886.          System.out.println("used game from " + pastOpponent.name.user + "'s suspended game list for " + name.user);
  887.          return true;
  888.       }
  889.     }
  890.     System.out.println("Found the player,but did not find the game?");
  891.     return false;
  892.   }
  893. } //end of class
  894.