home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / SendThread.java < prev    next >
Text File  |  1998-05-08  |  30KB  |  913 lines

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