client/ftpd/src/se/lu/thep/coreftpd/webserver/XerverKernel.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25
741 10 Oct 06 olle 26 //  Xerver Free Web Server
741 10 Oct 06 olle 27 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //
741 10 Oct 06 olle 30 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 31 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 32 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 33 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 34 //
741 10 Oct 06 olle 35 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 36 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 37 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 38 //  GNU General Public License for more details.
741 10 Oct 06 olle 39 //
741 10 Oct 06 olle 40 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 41 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 42 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //
741 10 Oct 06 olle 45 //  #############################################################
741 10 Oct 06 olle 46 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 47 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 48 //  ##                                                         ##
741 10 Oct 06 olle 49 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 50 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 51 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 52 //  ##                                                         ##
741 10 Oct 06 olle 53 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 54 //  #############################################################
741 10 Oct 06 olle 55
1652 22 May 07 gregory 56 package se.lu.thep.coreftpd.webserver;
741 10 Oct 06 olle 57
791 23 Oct 06 olle 58 import se.lu.thep.coreftpd.common.HostInfo;
791 23 Oct 06 olle 59 import se.lu.thep.coreftpd.common.MyHashTable;
791 23 Oct 06 olle 60 import se.lu.thep.coreftpd.common.MyString;
791 23 Oct 06 olle 61 import se.lu.thep.coreftpd.common.MyWindow;
741 10 Oct 06 olle 62 import java.awt.Color;
741 10 Oct 06 olle 63 import java.awt.Font;
741 10 Oct 06 olle 64 import java.io.BufferedReader;
741 10 Oct 06 olle 65 import java.io.File;
741 10 Oct 06 olle 66 import java.io.FileReader;
741 10 Oct 06 olle 67 import java.net.ServerSocket;
741 10 Oct 06 olle 68 import java.net.Socket;
741 10 Oct 06 olle 69 import java.util.Locale;
741 10 Oct 06 olle 70
741 10 Oct 06 olle 71 /**
1652 22 May 07 gregory 72  * 
1652 22 May 07 gregory 73  * <B>About this class:</B> <BR>
1652 22 May 07 gregory 74  * This is the kernel for <CODE>Xerver</CODE> (and it's a <CODE>Thread</CODE>).
1652 22 May 07 gregory 75  * This class creates all threads (<CODE>NewConnection</CODE>) that are used
1652 22 May 07 gregory 76  * when a request is sent to Xerver. Instead of starting this class, start
1652 22 May 07 gregory 77  * <CODE>Start.class</CODE>.
1652 22 May 07 gregory 78  * 
741 10 Oct 06 olle 79  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 80  * @version 1.0
741 10 Oct 06 olle 81  */
741 10 Oct 06 olle 82
1652 22 May 07 gregory 83 final public class XerverKernel extends Thread {
1652 22 May 07 gregory 84   private static final double thisVersion = 4.20;
741 10 Oct 06 olle 85
1652 22 May 07 gregory 86   private static final String thisVersionString = "4.20";
741 10 Oct 06 olle 87
1652 22 May 07 gregory 88   private static final String s_xerverName = "Xerver/"
1652 22 May 07 gregory 89       + getThisVersionString();
741 10 Oct 06 olle 90
1652 22 May 07 gregory 91   private final boolean b_showErrors = false;
1652 22 May 07 gregory 92
1652 22 May 07 gregory 93   private static final String hiddenFolder = "data" + File.separator;
1652 22 May 07 gregory 94
1652 22 May 07 gregory 95   private static final String errorFilesFolder = "errorHTML" + File.separator;
1652 22 May 07 gregory 96
1652 22 May 07 gregory 97   private static final String s_configFile = hiddenFolder + "Xerver.cfg";
1652 22 May 07 gregory 98
1652 22 May 07 gregory 99   private final static int i_soTimeoutAfterKeepAliveTransfer = 5000;
1652 22 May 07 gregory 100
1652 22 May 07 gregory 101   private static final int i_maxNumberOfActiveConnections = 150; // Note: one
1652 22 May 07 gregory 102                                   // normal
1652 22 May 07 gregory 103                                   // browser
1652 22 May 07 gregory 104                                   // might
1652 22 May 07 gregory 105                                   // create
1652 22 May 07 gregory 106                                   // more than
1652 22 May 07 gregory 107                                   // one
1652 22 May 07 gregory 108                                   // connection.
1652 22 May 07 gregory 109                                   // A visitor
1652 22 May 07 gregory 110                                   // with a
1652 22 May 07 gregory 111                                   // *normal*
1652 22 May 07 gregory 112                                   // browser
1652 22 May 07 gregory 113                                   // might
1652 22 May 07 gregory 114                                   // create
1652 22 May 07 gregory 115                                   // 1-5
1652 22 May 07 gregory 116                                   // connections
1652 22 May 07 gregory 117                                   // (depending
1652 22 May 07 gregory 118                                   // on how
1652 22 May 07 gregory 119                                   // well the
1652 22 May 07 gregory 120                                   // browser
1652 22 May 07 gregory 121                                   // uses the
1652 22 May 07 gregory 122                                   // "Keep-Alive"
1652 22 May 07 gregory 123                                   // connection
1652 22 May 07 gregory 124                                   // ability).
1652 22 May 07 gregory 125                                   // And yes,
1652 22 May 07 gregory 126                                   // this
1652 22 May 07 gregory 127                                   // means
1652 22 May 07 gregory 128                                   // that if
1652 22 May 07 gregory 129                                   // someone
1652 22 May 07 gregory 130                                   // creates
1652 22 May 07 gregory 131                                   // 150
1652 22 May 07 gregory 132                                   // connections
1652 22 May 07 gregory 133                                   // to this
1652 22 May 07 gregory 134                                   // server,
1652 22 May 07 gregory 135                                   // no one
1652 22 May 07 gregory 136                                   // else will
1652 22 May 07 gregory 137                                   // be able
1652 22 May 07 gregory 138                                   // to
1652 22 May 07 gregory 139                                   // connect
1652 22 May 07 gregory 140                                   // to us
1652 22 May 07 gregory 141                                   // anymore.
1652 22 May 07 gregory 142
741 10 Oct 06 olle 143   public static int i_portNr;
741 10 Oct 06 olle 144
1652 22 May 07 gregory 145   public static boolean b_startupWindowMode; // If this is true, no window
1652 22 May 07 gregory 146                         // will be opened. If this is
1652 22 May 07 gregory 147                         // false, the awt-window will be
1652 22 May 07 gregory 148                         // used. NOTE: When you start
1652 22 May 07 gregory 149                         // this class from the Swing
1652 22 May 07 gregory 150                         // interface, this will be set
1652 22 May 07 gregory 151                         // to true so that the
1652 22 May 07 gregory 152                         // AWT-window won't popup //When
1652 22 May 07 gregory 153                         // you call the
1652 22 May 07 gregory 154                         // XerverKernel()-constructor
1652 22 May 07 gregory 155                         // this varaiable will be set to
1652 22 May 07 gregory 156                         // true/false depending on what
1652 22 May 07 gregory 157                         // you have choosed in the
1652 22 May 07 gregory 158                         // setup-file: true=[0=you have
1652 22 May 07 gregory 159                         // choosen to run with no
1652 22 May 07 gregory 160                         // "window"]; false=[1 = you
1652 22 May 07 gregory 161                         // have choosen to use a static
1652 22 May 07 gregory 162                         // window (AWT); 2 = you have
1652 22 May 07 gregory 163                         // choosen to use the most
1652 22 May 07 gregory 164                         // advanced interface (with
1652 22 May 07 gregory 165                         // logging) (Swing)]
1652 22 May 07 gregory 166
741 10 Oct 06 olle 167   /*
1652 22 May 07 gregory 168    * public String [] as_indexNames; public String [] as_sharedPaths; public
1652 22 May 07 gregory 169    * String [] as_fileExtensions; public String s_rootPath; public MyHashTable
1652 22 May 07 gregory 170    * myHT_runnableExtensions; public MyHashTable myHT_allAliases; public
1652 22 May 07 gregory 171    * String [] as_xerverPasswd; public boolean b_allowFolderListing; public
1652 22 May 07 gregory 172    * boolean b_allowTheseFileExtensions; public boolean b_shareHiddenFiles;
1652 22 May 07 gregory 173    * public boolean b_allowExecuteScript;
1652 22 May 07 gregory 174    */
741 10 Oct 06 olle 175
741 10 Oct 06 olle 176   public boolean xerverHasStarted;
1652 22 May 07 gregory 177
741 10 Oct 06 olle 178   public static String s_egetIp;
1652 22 May 07 gregory 179
741 10 Oct 06 olle 180   private MyWindow theWindow;
741 10 Oct 06 olle 181
1652 22 May 07 gregory 182   public MenuOptions myMenuOptions = null; // This will remain null if, and
1652 22 May 07 gregory 183                         // only if, you run Xerver
1652 22 May 07 gregory 184                         // without the Swing interface.
1652 22 May 07 gregory 185                         // However, if you start Xerver
1652 22 May 07 gregory 186                         // from the swing interface this
1652 22 May 07 gregory 187                         // will NOT be null.
741 10 Oct 06 olle 188
1652 22 May 07 gregory 189   private ThreadGroup connectionsThreadGroup;// Make all connection-Threads
1652 22 May 07 gregory 190                         // belong to this
1652 22 May 07 gregory 191                         // connection-ThreadGroup. (now
1652 22 May 07 gregory 192                         // we can easy keep track of how
1652 22 May 07 gregory 193                         // many Threads we have alive)
1652 22 May 07 gregory 194
1652 22 May 07 gregory 195   XerverKernel() // Run this only if you want the setup-file to decide if the
1652 22 May 07 gregory 196           // AWT window shall open or not
1652 22 May 07 gregory 197   { // When you call the XerverKernel()-constructor "b_startupWindowMode"
1652 22 May 07 gregory 198     // will be set to true/false depending on what you have choosed in the
1652 22 May 07 gregory 199     // setup-file: true=[0=you have choosen to run with no "window"];
1652 22 May 07 gregory 200     // false=[1 = you have choosen to use a static window (AWT); 2 = you
1652 22 May 07 gregory 201     // have choosen to use the most advanced interface (with logging)
1652 22 May 07 gregory 202     // (Swing)]
1652 22 May 07 gregory 203     Locale.setDefault(new Locale("en", "US")); // I "java.util.*"
1652 22 May 07 gregory 204     // setPriority(MAX_PRIORITY);
741 10 Oct 06 olle 205     initVariables();
741 10 Oct 06 olle 206     getServerDefaults();
1652 22 May 07 gregory 207     exchangeVariablesBetweenClasses(); // ALWAYS run this after running
1652 22 May 07 gregory 208                       // "getServerDefaults()"
1652 22 May 07 gregory 209     // totalNumberOfHits=0;
1652 22 May 07 gregory 210     // totalNumberOfBytesDownloaded=0;
741 10 Oct 06 olle 211     startXerver();
741 10 Oct 06 olle 212   }
741 10 Oct 06 olle 213
1652 22 May 07 gregory 214   // If you call this constructor with null Xerver will start but without the
1652 22 May 07 gregory 215   // "Xerver is Running"-window.
1652 22 May 07 gregory 216   XerverKernel(MenuOptions argMenuOptions) {
1652 22 May 07 gregory 217     this(true, argMenuOptions);
741 10 Oct 06 olle 218   }
741 10 Oct 06 olle 219
1652 22 May 07 gregory 220   // If you call this constructor with null Xerver will start but without the
1652 22 May 07 gregory 221   // "Xerver is Running"-window.
1652 22 May 07 gregory 222   // if argStartupWindowMode==true, no window will open. If
1652 22 May 07 gregory 223   // argStartupWindowMode==false an AWT window will popup
1652 22 May 07 gregory 224   XerverKernel(boolean argStartupWindowMode, MenuOptions argMenuOptions) {
1652 22 May 07 gregory 225     myMenuOptions = argMenuOptions;
1652 22 May 07 gregory 226     Locale.setDefault(new Locale("en", "US")); // I "java.util.*"
741 10 Oct 06 olle 227     initVariables();
741 10 Oct 06 olle 228     getServerDefaults();
1652 22 May 07 gregory 229     exchangeVariablesBetweenClasses(); // ALWAYS run this after running
1652 22 May 07 gregory 230                       // "getServerDefaults()"
1652 22 May 07 gregory 231     b_startupWindowMode = argStartupWindowMode; // Also, this overwrites
1652 22 May 07 gregory 232                           // what the Xerver.cfg says
1652 22 May 07 gregory 233                           // about this variable
1652 22 May 07 gregory 234     // totalNumberOfHits=0;
1652 22 May 07 gregory 235     // totalNumberOfBytesDownloaded=0;
741 10 Oct 06 olle 236     startXerver();
741 10 Oct 06 olle 237   }
741 10 Oct 06 olle 238
1652 22 May 07 gregory 239   private void initVariables() {
1652 22 May 07 gregory 240     try {
741 10 Oct 06 olle 241       /*
1652 22 May 07 gregory 242        * s_egetIp=InetAddress.getLocalHost().toString(); //
1652 22 May 07 gregory 243        * "pii-450/213.114.143.48"
1652 22 May 07 gregory 244        * s_egetIp=s_egetIp.substring(s_egetIp.indexOf("/")+1);
1652 22 May 07 gregory 245        */
1652 22 May 07 gregory 246       connectionsThreadGroup = new ThreadGroup("Connections");
1652 22 May 07 gregory 247       s_egetIp = HostInfo.getIPorLocalhost();
1652 22 May 07 gregory 248     } catch (Exception e) {
1652 22 May 07 gregory 249       if (b_showErrors)
1652 22 May 07 gregory 250         System.out
1652 22 May 07 gregory 251             .println("An error has occured @ initVariables\n" + e);
741 10 Oct 06 olle 252     }
741 10 Oct 06 olle 253   }
741 10 Oct 06 olle 254
2386 14 Nov 07 gregory 255   @Override
1652 22 May 07 gregory 256   public void run() {
1652 22 May 07 gregory 257     try {
1652 22 May 07 gregory 258       ServerSocket myServerSocket = new ServerSocket(i_portNr);
741 10 Oct 06 olle 259
1652 22 May 07 gregory 260       if (myMenuOptions == null) // If the user has no graphical
1652 22 May 07 gregory 261                     // interface (is not using
1652 22 May 07 gregory 262                     // ProgramWindow), then...
1652 22 May 07 gregory 263       {
1652 22 May 07 gregory 264         writeManyChar("#", 70);
1652 22 May 07 gregory 265         writeNiceText(
1652 22 May 07 gregory 266             "Xerver, powered with Java Technology, is up and running!",
1652 22 May 07 gregory 267             64);
1652 22 May 07 gregory 268         writeNiceText("http://www.JavaScript.nu/xerver/", 64);
1652 22 May 07 gregory 269         writeManyChar("#", 70);
1652 22 May 07 gregory 270         writeNiceText("Xerver is currently scanning port " + i_portNr
1652 22 May 07 gregory 271             + " for new connections.", 64);
1652 22 May 07 gregory 272         writeNiceText("You may change this in the setup. Enjoy!", 64);
1652 22 May 07 gregory 273         writeNiceText("To visit your website, surf to:", 64);
1652 22 May 07 gregory 274         if (i_portNr != 80)
1652 22 May 07 gregory 275           writeNiceText("http://" + s_egetIp + ":" + i_portNr + "/",
1652 22 May 07 gregory 276               64);
1652 22 May 07 gregory 277         else
1652 22 May 07 gregory 278           writeNiceText("http://" + s_egetIp + "/", 64);
741 10 Oct 06 olle 279
1652 22 May 07 gregory 280         // InetAddress.getByName("localhost").toString() ==
1652 22 May 07 gregory 281         // "localhost/127.0.0.1"
741 10 Oct 06 olle 282
1652 22 May 07 gregory 283         writeNiceText(
1652 22 May 07 gregory 284             "Of course, also your friends can visit your website at this URL.",
1652 22 May 07 gregory 285             64);
1652 22 May 07 gregory 286         writeManyChar("#", 70);
1652 22 May 07 gregory 287         System.out.println("");
1652 22 May 07 gregory 288         System.out.println("");
1652 22 May 07 gregory 289         writeManyChar("#", 70);
1652 22 May 07 gregory 290         writeNiceText("IMPORTANT:", 64);
1652 22 May 07 gregory 291         writeNiceText(
1652 22 May 07 gregory 292             "If you close this window Xerver will be shut down!",
1652 22 May 07 gregory 293             64);
1652 22 May 07 gregory 294         writeManyChar("#", 70);
1652 22 May 07 gregory 295       }
741 10 Oct 06 olle 296
1652 22 May 07 gregory 297       openWindow();
1652 22 May 07 gregory 298       Socket so_userConnection;// create this ONCE outside the loop...
1652 22 May 07 gregory 299                     // (it's faster...)
1652 22 May 07 gregory 300       while (true) // IMPORTANT!!! make sure this loop won't go around
1652 22 May 07 gregory 301               // too many times without doing anything or java
1652 22 May 07 gregory 302               // will use up to 100% CPU. Instead let the loop be
1652 22 May 07 gregory 303               // halted by for example an accept call which will
1652 22 May 07 gregory 304               // wait for a network connection to be
1652 22 May 07 gregory 305               // established...
741 10 Oct 06 olle 306       {
1652 22 May 07 gregory 307         NewConnection myNewConnection;
1652 22 May 07 gregory 308         so_userConnection = myServerSocket.accept(); // Wait until a
1652 22 May 07 gregory 309                                 // request is
1652 22 May 07 gregory 310                                 // sent to the
1652 22 May 07 gregory 311                                 // server (with
1652 22 May 07 gregory 312                                 // "myServerSocket.setSoTimeout()"
1652 22 May 07 gregory 313                                 // we can limit
1652 22 May 07 gregory 314                                 // the time we
1652 22 May 07 gregory 315                                 // wait for
1652 22 May 07 gregory 316                                 // "accept")
1652 22 May 07 gregory 317         so_userConnection
1652 22 May 07 gregory 318             .setSoTimeout(i_soTimeoutAfterKeepAliveTransfer); // IMPORTANT:
1652 22 May 07 gregory 319                                       // This
1652 22 May 07 gregory 320                                       // must
1652 22 May 07 gregory 321                                       // be
1652 22 May 07 gregory 322                                       // long
1652 22 May 07 gregory 323                                       // enough
1652 22 May 07 gregory 324                                       // to
1652 22 May 07 gregory 325                                       // make
1652 22 May 07 gregory 326                                       // sure
1652 22 May 07 gregory 327                                       // the
1652 22 May 07 gregory 328                                       // Keep-Alive-functionality
1652 22 May 07 gregory 329                                       // will
1652 22 May 07 gregory 330                                       // work.
1652 22 May 07 gregory 331                                       // Lets
1652 22 May 07 gregory 332                                       // say
1652 22 May 07 gregory 333                                       // this
1652 22 May 07 gregory 334                                       // is
1652 22 May 07 gregory 335                                       // set
1652 22 May 07 gregory 336                                       // to
1652 22 May 07 gregory 337                                       // 5000
1652 22 May 07 gregory 338                                       // (5
1652 22 May 07 gregory 339                                       // sec),
1652 22 May 07 gregory 340                                       // and
1652 22 May 07 gregory 341                                       // a
1652 22 May 07 gregory 342                                       // browser
1652 22 May 07 gregory 343                                       // starts
1652 22 May 07 gregory 344                                       // to
1652 22 May 07 gregory 345                                       // download
1652 22 May 07 gregory 346                                       // a
1652 22 May 07 gregory 347                                       // file
1652 22 May 07 gregory 348                                       // which
1652 22 May 07 gregory 349                                       // might
1652 22 May 07 gregory 350                                       // take
1652 22 May 07 gregory 351                                       // 6
1652 22 May 07 gregory 352                                       // sec.
1652 22 May 07 gregory 353                                       // After
1652 22 May 07 gregory 354                                       // the
1652 22 May 07 gregory 355                                       // download
1652 22 May 07 gregory 356                                       // is
1652 22 May 07 gregory 357                                       // completed
1652 22 May 07 gregory 358                                       // the
1652 22 May 07 gregory 359                                       // connection
1652 22 May 07 gregory 360                                       // will
1652 22 May 07 gregory 361                                       // be
1652 22 May 07 gregory 362                                       // closed,
1652 22 May 07 gregory 363                                       // which
1652 22 May 07 gregory 364                                       // means
1652 22 May 07 gregory 365                                       // we
1652 22 May 07 gregory 366                                       // don't
1652 22 May 07 gregory 367                                       // use
1652 22 May 07 gregory 368                                       // the
1652 22 May 07 gregory 369                                       // smart
1652 22 May 07 gregory 370                                       // "Keep-Alive"
1652 22 May 07 gregory 371                                       // features.
1652 22 May 07 gregory 372                                       // The
1652 22 May 07 gregory 373                                       // solution
1652 22 May 07 gregory 374                                       // is
1652 22 May 07 gregory 375                                       // to
1652 22 May 07 gregory 376                                       // set
1652 22 May 07 gregory 377                                       // this
1652 22 May 07 gregory 378                                       // to 0
1652 22 May 07 gregory 379                                       // (infinity)
1652 22 May 07 gregory 380                                       // when
1652 22 May 07 gregory 381                                       // the
1652 22 May 07 gregory 382                                       // download
1652 22 May 07 gregory 383                                       // starts
1652 22 May 07 gregory 384                                       // and
1652 22 May 07 gregory 385                                       // set
1652 22 May 07 gregory 386                                       // this
1652 22 May 07 gregory 387                                       // back
1652 22 May 07 gregory 388                                       // to 5
1652 22 May 07 gregory 389                                       // secs
1652 22 May 07 gregory 390                                       // when
1652 22 May 07 gregory 391                                       // the
1652 22 May 07 gregory 392                                       // file
1652 22 May 07 gregory 393                                       // download
1652 22 May 07 gregory 394                                       // is
1652 22 May 07 gregory 395                                       // finished.
1652 22 May 07 gregory 396         if (xerverHasStarted
1652 22 May 07 gregory 397             && connectionsThreadGroup.activeCount() <= i_maxNumberOfActiveConnections) // IF
1652 22 May 07 gregory 398                                                   // [The
1652 22 May 07 gregory 399                                                   // browser
1652 22 May 07 gregory 400                                                   // has
1652 22 May 07 gregory 401                                                   // started]
1652 22 May 07 gregory 402                                                   // AND
1652 22 May 07 gregory 403                                                   // [the
1652 22 May 07 gregory 404                                                   // maximum
1652 22 May 07 gregory 405                                                   // number
1652 22 May 07 gregory 406                                                   // of
1652 22 May 07 gregory 407                                                   // connections
1652 22 May 07 gregory 408                                                   // allowed
1652 22 May 07 gregory 409                                                   // has
1652 22 May 07 gregory 410                                                   // not
1652 22 May 07 gregory 411                                                   // been
1652 22 May 07 gregory 412                                                   // reached]...
741 10 Oct 06 olle 413         {
1652 22 May 07 gregory 414           // i_numberOfUsersOnline++;
1652 22 May 07 gregory 415           myNewConnection = new NewConnection(so_userConnection,
1652 22 May 07 gregory 416               connectionsThreadGroup);
1652 22 May 07 gregory 417           try {
1652 22 May 07 gregory 418             myNewConnection.start();
1652 22 May 07 gregory 419           } catch (Exception e) {
1652 22 May 07 gregory 420             if (b_showErrors)
1652 22 May 07 gregory 421               System.out.println("An error has occured @ run\n"
1652 22 May 07 gregory 422                   + e);
1652 22 May 07 gregory 423           }
1652 22 May 07 gregory 424         } else {
1652 22 May 07 gregory 425           so_userConnection.close();
741 10 Oct 06 olle 426         }
741 10 Oct 06 olle 427       }
1652 22 May 07 gregory 428     } catch (Exception e) {
1652 22 May 07 gregory 429       if (!b_startupWindowMode || myMenuOptions != null) // If [the user
1652 22 May 07 gregory 430                                 // shall see all
1652 22 May 07 gregory 431                                 // popup
1652 22 May 07 gregory 432                                 // windows] OR
1652 22 May 07 gregory 433                                 // [the user has
1652 22 May 07 gregory 434                                 // a graphical
1652 22 May 07 gregory 435                                 // interface (is
1652 22 May 07 gregory 436                                 // using
1652 22 May 07 gregory 437                                 // ProgramWindow)],
1652 22 May 07 gregory 438                                 // then...
741 10 Oct 06 olle 439       {
1652 22 May 07 gregory 440         theWindow = new MyWindow(530, 200, "Xerver: An error occured");
1652 22 May 07 gregory 441         System.out
1652 22 May 07 gregory 442             .println("An error occured:\nYou are probably already running Xerver.\nIf you're not running Xerver already you have another application using port "
1652 22 May 07 gregory 443                 + i_portNr
1652 22 May 07 gregory 444                 + ".\nPlease run the setup and change the port number you are using to another number.");
1652 22 May 07 gregory 445         theWindow.setBackground(new Color(212, 208, 200));
741 10 Oct 06 olle 446
1652 22 May 07 gregory 447         int deltaX = 0, deltaY = 0; // To make it easy to adjust there
1652 22 May 07 gregory 448                       // is no specific origo
1652 22 May 07 gregory 449         theWindow.setFont(new Font("Arial, Verdana", Font.BOLD, 38));
741 10 Oct 06 olle 450
1652 22 May 07 gregory 451         theWindow.setColor(Color.black);
1652 22 May 07 gregory 452         theWindow.drawString("X", 22 + deltaX, 32 + deltaY);
1652 22 May 07 gregory 453         theWindow.setColor(Color.black);
1652 22 May 07 gregory 454         theWindow.drawString("erver", 46 + deltaX, 32 + deltaY);
1652 22 May 07 gregory 455         theWindow.setColor(Color.gray);
1652 22 May 07 gregory 456         theWindow.drawString("- an error occured", 152 + deltaX,
1652 22 May 07 gregory 457             32 + deltaY);
741 10 Oct 06 olle 458
1652 22 May 07 gregory 459         theWindow.setColor(Color.red);
1652 22 May 07 gregory 460         theWindow.drawString("X", 20 + deltaX, 30 + deltaY);
1652 22 May 07 gregory 461         theWindow.setColor(Color.blue);
1652 22 May 07 gregory 462         theWindow.drawString("erver", 44 + deltaX, 30 + deltaY);
1652 22 May 07 gregory 463         theWindow.setColor(Color.black);
1652 22 May 07 gregory 464         theWindow.drawString("- an error occured", 150 + deltaX,
1652 22 May 07 gregory 465             30 + deltaY);
741 10 Oct 06 olle 466
1652 22 May 07 gregory 467         theWindow.setColor(Color.black);
1652 22 May 07 gregory 468         theWindow.setFont(new Font("Courier", Font.PLAIN, 12));
741 10 Oct 06 olle 469
1652 22 May 07 gregory 470         int xKord = 5, yKord = 50, deltaYKord = 13;
1652 22 May 07 gregory 471         theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 472             yKord += deltaYKord);
1652 22 May 07 gregory 473         theWindow.drawString(returnNiceText("An error occured:", 64),
1652 22 May 07 gregory 474             xKord, yKord += deltaYKord);
1652 22 May 07 gregory 475         theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 476             "You are probably already running Xerver.", 64), xKord,
1652 22 May 07 gregory 477             yKord += deltaYKord);
1652 22 May 07 gregory 478         theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 479             "If you're not running Xerver already you have", 64),
1652 22 May 07 gregory 480             xKord, yKord += deltaYKord);
1652 22 May 07 gregory 481         theWindow.drawString(
1652 22 May 07 gregory 482             returnNiceText("another application using port "
1652 22 May 07 gregory 483                 + i_portNr + ".", 64), xKord,
1652 22 May 07 gregory 484             yKord += deltaYKord);
1652 22 May 07 gregory 485         theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 486             "Please run the setup and change the port number", 64),
1652 22 May 07 gregory 487             xKord, yKord += deltaYKord);
1652 22 May 07 gregory 488         theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 489             "you are using to another number.", 64), xKord,
1652 22 May 07 gregory 490             yKord += deltaYKord);
1652 22 May 07 gregory 491         theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 492             yKord += deltaYKord);
1652 22 May 07 gregory 493       } else
1652 22 May 07 gregory 494         System.out
1652 22 May 07 gregory 495             .println("An error occured:\nYou are probably already running Xerver.\nIf you're not running Xerver already you have\nanother application using port "
1652 22 May 07 gregory 496                 + i_portNr
1652 22 May 07 gregory 497                 + ".\nPlease run the setup and change the port number\nyou are using to another number.");
741 10 Oct 06 olle 498     }
741 10 Oct 06 olle 499   }
741 10 Oct 06 olle 500
1652 22 May 07 gregory 501   public void addVisitorToStat(HitStatistic hit) {
1652 22 May 07 gregory 502     if (myMenuOptions != null)
741 10 Oct 06 olle 503       myMenuOptions.addIPToList(hit);
741 10 Oct 06 olle 504   }
741 10 Oct 06 olle 505
1652 22 May 07 gregory 506   public int getNumberOfActiveConnections() {
741 10 Oct 06 olle 507     return connectionsThreadGroup.activeCount();
741 10 Oct 06 olle 508   }
741 10 Oct 06 olle 509
1652 22 May 07 gregory 510   public void startXerver() {
1652 22 May 07 gregory 511     NewConnection.b_acceptConnections = true;
1652 22 May 07 gregory 512     xerverHasStarted = true;
741 10 Oct 06 olle 513   }
741 10 Oct 06 olle 514
1652 22 May 07 gregory 515   public void stopXerver() {
1652 22 May 07 gregory 516     NewConnection.b_acceptConnections = false;
1652 22 May 07 gregory 517     xerverHasStarted = false;
741 10 Oct 06 olle 518   }
741 10 Oct 06 olle 519
1652 22 May 07 gregory 520   private void openWindow() {
1652 22 May 07 gregory 521     if (!b_startupWindowMode) // If the user has no graphical interface
1652 22 May 07 gregory 522                   // (is not using ProgramWindow), then...
741 10 Oct 06 olle 523     {
1652 22 May 07 gregory 524       theWindow = new MyWindow(530, 350, "Xerver is running");
1652 22 May 07 gregory 525       // theWindow.killProgramAtShutdown=true; //true is default
741 10 Oct 06 olle 526
741 10 Oct 06 olle 527       theWindow.setColor(Color.black);
1652 22 May 07 gregory 528       theWindow.setBackground(new Color(212, 208, 200));
741 10 Oct 06 olle 529
1652 22 May 07 gregory 530       int deltaX = 45, deltaY = 0; // To make it easy to adjust there
1652 22 May 07 gregory 531                       // is no specific origo
741 10 Oct 06 olle 532       theWindow.setFont(new Font("Arial, Verdana", Font.BOLD, 38));
741 10 Oct 06 olle 533       theWindow.setColor(Color.black);
1652 22 May 07 gregory 534       theWindow.drawString("X", 22 + deltaX, 32 + deltaY);
741 10 Oct 06 olle 535       theWindow.setColor(Color.black);
1652 22 May 07 gregory 536       theWindow.drawString("erver", 46 + deltaX, 32 + deltaY);
741 10 Oct 06 olle 537       theWindow.setColor(Color.gray);
1652 22 May 07 gregory 538       theWindow.drawString("is running...", 152 + deltaX, 32 + deltaY);
741 10 Oct 06 olle 539
741 10 Oct 06 olle 540       theWindow.setColor(Color.red);
1652 22 May 07 gregory 541       theWindow.drawString("X", 20 + deltaX, 30 + deltaY);
741 10 Oct 06 olle 542       theWindow.setColor(Color.blue);
1652 22 May 07 gregory 543       theWindow.drawString("erver", 44 + deltaX, 30 + deltaY);
741 10 Oct 06 olle 544       theWindow.setColor(Color.black);
1652 22 May 07 gregory 545       theWindow.drawString("is running...", 150 + deltaX, 30 + deltaY);
741 10 Oct 06 olle 546
741 10 Oct 06 olle 547       theWindow.setColor(Color.black);
741 10 Oct 06 olle 548       theWindow.setFont(new Font("Courier", Font.PLAIN, 12));
741 10 Oct 06 olle 549
1652 22 May 07 gregory 550       int xKord = 5, yKord = 50, deltaYKord = 13;
1652 22 May 07 gregory 551       theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 552           yKord += deltaYKord);
1652 22 May 07 gregory 553       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 554           "Xerver, powered with Java Technology, is up and running!",
1652 22 May 07 gregory 555           64), xKord, yKord += deltaYKord);
1652 22 May 07 gregory 556       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 557           "http://www.JavaScript.nu/xerver/", 64), xKord,
1652 22 May 07 gregory 558           yKord += deltaYKord);
1652 22 May 07 gregory 559       theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 560           yKord += deltaYKord);
1652 22 May 07 gregory 561       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 562           "Xerver is currently scanning port " + i_portNr
1652 22 May 07 gregory 563               + " for new connections.", 64), xKord,
1652 22 May 07 gregory 564           yKord += deltaYKord);
1652 22 May 07 gregory 565       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 566           "You may change this in the setup. Enjoy!", 64), xKord,
1652 22 May 07 gregory 567           yKord += deltaYKord);
1652 22 May 07 gregory 568       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 569           "To visit your website, surf to:", 64), xKord,
1652 22 May 07 gregory 570           yKord += deltaYKord);
1652 22 May 07 gregory 571       if (i_portNr != 80)
1652 22 May 07 gregory 572         theWindow.drawString(returnNiceText("http://" + s_egetIp + ":"
1652 22 May 07 gregory 573             + i_portNr + "/", 64), xKord, yKord += deltaYKord);
741 10 Oct 06 olle 574       else
1652 22 May 07 gregory 575         theWindow.drawString(returnNiceText("http://" + s_egetIp + "/",
1652 22 May 07 gregory 576             64), xKord, yKord += deltaYKord);
1652 22 May 07 gregory 577       theWindow
1652 22 May 07 gregory 578           .drawString(
1652 22 May 07 gregory 579               returnNiceText(
1652 22 May 07 gregory 580                   "Of course, also your friends can visit your website at this URL.",
1652 22 May 07 gregory 581                   64), xKord, yKord += deltaYKord);
1652 22 May 07 gregory 582       theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 583           yKord += deltaYKord);
741 10 Oct 06 olle 584
1652 22 May 07 gregory 585       theWindow.drawString("", xKord, yKord += deltaYKord);
1652 22 May 07 gregory 586       theWindow.drawString("", xKord, yKord += deltaYKord);
741 10 Oct 06 olle 587
741 10 Oct 06 olle 588       theWindow.setColor(Color.red);
741 10 Oct 06 olle 589
1652 22 May 07 gregory 590       theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 591           yKord += deltaYKord);
1652 22 May 07 gregory 592       theWindow.drawString(returnNiceText("IMPORTANT:", 64), xKord,
1652 22 May 07 gregory 593           yKord += deltaYKord);
1652 22 May 07 gregory 594       theWindow.drawString(returnNiceText(
1652 22 May 07 gregory 595           "If you close this window Xerver will be shut down!", 64),
1652 22 May 07 gregory 596           xKord, yKord += deltaYKord);
1652 22 May 07 gregory 597       theWindow.drawString(returnManyChar("#", 70), xKord,
1652 22 May 07 gregory 598           yKord += deltaYKord);
741 10 Oct 06 olle 599     }
741 10 Oct 06 olle 600   }
741 10 Oct 06 olle 601
1652 22 May 07 gregory 602   public void getServerDefaults() {
1652 22 May 07 gregory 603     // *********READ SETTINGS FROM FILE!*******
1652 22 May 07 gregory 604     try {
1652 22 May 07 gregory 605       BufferedReader f_setupFileData = new BufferedReader(new FileReader(
1652 22 May 07 gregory 606           s_configFile));
741 10 Oct 06 olle 607
741 10 Oct 06 olle 608       int tmp;
1652 22 May 07 gregory 609       NewConnection.i_portNr = Integer.parseInt(f_setupFileData
1652 22 May 07 gregory 610           .readLine());
1652 22 May 07 gregory 611       NewConnection.as_indexNames = MyString.makeArrayOfString(
1652 22 May 07 gregory 612           f_setupFileData.readLine(), ",");
1652 22 May 07 gregory 613       NewConnection.as_sharedPaths = MyString.makeArrayOfString(
1652 22 May 07 gregory 614           f_setupFileData.readLine(), ",");
1652 22 May 07 gregory 615       String tmpStr = f_setupFileData.readLine();
1652 22 May 07 gregory 616       if (tmpStr != null)
1652 22 May 07 gregory 617         tmpStr = tmpStr.toLowerCase(); // File extensions shall be
1652 22 May 07 gregory 618                         // lower case, there is no
1652 22 May 07 gregory 619                         // difference between "html" and
1652 22 May 07 gregory 620                         // "HTML"...
1652 22 May 07 gregory 621       NewConnection.as_fileExtensions = MyString.makeArrayOfString(
1652 22 May 07 gregory 622           tmpStr, ","); // NOTE: always lower case...
741 10 Oct 06 olle 623       NewConnection.s_rootPath = f_setupFileData.readLine();
1652 22 May 07 gregory 624       NewConnection.myHT_runnableExtensions = new MyHashTable(
1652 22 May 07 gregory 625           f_setupFileData.readLine());
1652 22 May 07 gregory 626       NewConnection.myHT_allAliases = new MyHashTable(f_setupFileData
1652 22 May 07 gregory 627           .readLine());
1652 22 May 07 gregory 628       NewConnection.as_xerverPasswd = MyString.makeArrayOfString(
1652 22 May 07 gregory 629           f_setupFileData.readLine(), "<<$>>");
741 10 Oct 06 olle 630
741 10 Oct 06 olle 631       tmp = Integer.parseInt(f_setupFileData.readLine());
1652 22 May 07 gregory 632       if (tmp == 1)
1652 22 May 07 gregory 633         NewConnection.b_allowFolderListing = true;
741 10 Oct 06 olle 634       else
1652 22 May 07 gregory 635         NewConnection.b_allowFolderListing = false;
741 10 Oct 06 olle 636
741 10 Oct 06 olle 637       tmp = Integer.parseInt(f_setupFileData.readLine());
1652 22 May 07 gregory 638       if (tmp == 1)
1652 22 May 07 gregory 639         NewConnection.b_allowTheseFileExtensions = true;
741 10 Oct 06 olle 640       else
1652 22 May 07 gregory 641         NewConnection.b_allowTheseFileExtensions = false;
741 10 Oct 06 olle 642
741 10 Oct 06 olle 643       tmp = Integer.parseInt(f_setupFileData.readLine());
1652 22 May 07 gregory 644       if (tmp == 1)
1652 22 May 07 gregory 645         NewConnection.b_shareHiddenFiles = true;
741 10 Oct 06 olle 646       else
1652 22 May 07 gregory 647         NewConnection.b_shareHiddenFiles = false;
741 10 Oct 06 olle 648
1652 22 May 07 gregory 649       tmp = Integer.parseInt(f_setupFileData.readLine()); // Note: today
1652 22 May 07 gregory 650                                 // it doesn't
1652 22 May 07 gregory 651                                 // matter what
1652 22 May 07 gregory 652                                 // we found
1652 22 May 07 gregory 653                                 // here, as the
1652 22 May 07 gregory 654                                 // XerverKernel()-constructor
1652 22 May 07 gregory 655                                 // is never
1652 22 May 07 gregory 656                                 // called.
1652 22 May 07 gregory 657                                 // However, if,
1652 22 May 07 gregory 658                                 // and only if,
1652 22 May 07 gregory 659                                 // the
1652 22 May 07 gregory 660                                 // XerverKernel()-constructor
1652 22 May 07 gregory 661                                 // is called,
1652 22 May 07 gregory 662                                 // the value of
1652 22 May 07 gregory 663                                 // startupWindowMode
1652 22 May 07 gregory 664                                 // will depend
1652 22 May 07 gregory 665                                 // on what is
1652 22 May 07 gregory 666                                 // found on this
1652 22 May 07 gregory 667                                 // line
1652 22 May 07 gregory 668                                 // (otherwise,
1652 22 May 07 gregory 669                                 // the
1652 22 May 07 gregory 670                                 // startupWindowMode
1652 22 May 07 gregory 671                                 // is
1652 22 May 07 gregory 672                                 // owerwritten
1652 22 May 07 gregory 673                                 // by an
1652 22 May 07 gregory 674                                 // argument that
1652 22 May 07 gregory 675                                 // is sent to
1652 22 May 07 gregory 676                                 // the
1652 22 May 07 gregory 677                                 // constructor
1652 22 May 07 gregory 678                                 // of
1652 22 May 07 gregory 679                                 // XerverKernel))
1652 22 May 07 gregory 680       if (tmp == 0) // note ==0
1652 22 May 07 gregory 681         NewConnection.b_startupWindowMode = true;
741 10 Oct 06 olle 682       else
1652 22 May 07 gregory 683         NewConnection.b_startupWindowMode = false;
741 10 Oct 06 olle 684
741 10 Oct 06 olle 685       tmp = Integer.parseInt(f_setupFileData.readLine());
1652 22 May 07 gregory 686       if (tmp == 1)
1652 22 May 07 gregory 687         NewConnection.b_allowExecuteScript = true;
741 10 Oct 06 olle 688       else
1652 22 May 07 gregory 689         NewConnection.b_allowExecuteScript = false;
741 10 Oct 06 olle 690
1652 22 May 07 gregory 691       f_setupFileData.close();
1652 22 May 07 gregory 692     } catch (Exception e) {
1652 22 May 07 gregory 693       System.out.println("An error occured!\nPlease make sure that "
1652 22 May 07 gregory 694           + s_configFile
1652 22 May 07 gregory 695           + " is in the data-directory (in your Xerver folder).\n"
1652 22 May 07 gregory 696           + e);
741 10 Oct 06 olle 697       System.exit(0);
741 10 Oct 06 olle 698     }
741 10 Oct 06 olle 699   }
741 10 Oct 06 olle 700
1652 22 May 07 gregory 701   public void exchangeVariablesBetweenClasses() {
1652 22 May 07 gregory 702     /* Don't only set to NewConnection but also to this class */
1652 22 May 07 gregory 703     b_startupWindowMode = NewConnection.b_startupWindowMode;
1652 22 May 07 gregory 704     i_portNr = NewConnection.i_portNr;
741 10 Oct 06 olle 705
1652 22 May 07 gregory 706     /* Don't only set to this class but also to NewConnection */
1652 22 May 07 gregory 707     NewConnection.myMenuOptions = myMenuOptions;
741 10 Oct 06 olle 708
1652 22 May 07 gregory 709     // Finally set this (which we don't actually read from the file)...
1652 22 May 07 gregory 710     NewConnection.s_defaultRootLocationWithoutSlashAtEnd = NewConnection.s_rootPath
1652 22 May 07 gregory 711         .substring(0, NewConnection.s_rootPath.length() - 1);
741 10 Oct 06 olle 712   }
741 10 Oct 06 olle 713
1652 22 May 07 gregory 714   private static void writeNiceText(String txt, int lengthOfText) {
1652 22 May 07 gregory 715     StringBuffer strBuf = new StringBuffer("## " + txt);
1652 22 May 07 gregory 716     int forGoUntil = lengthOfText - txt.length(); // Optimization...
1652 22 May 07 gregory 717     for (int i = 0; i < forGoUntil; i++)
741 10 Oct 06 olle 718       strBuf.append(" ");
741 10 Oct 06 olle 719     strBuf.append(" ##");
741 10 Oct 06 olle 720     System.out.println(strBuf.toString());
741 10 Oct 06 olle 721   }
741 10 Oct 06 olle 722
1652 22 May 07 gregory 723   private static void writeManyChar(String txt, int lengthOfText) {
1652 22 May 07 gregory 724     StringBuffer strBuf = new StringBuffer(txt); // Add the first txt
1652 22 May 07 gregory 725                             // here....
1652 22 May 07 gregory 726                             // //Optimization...
1652 22 May 07 gregory 727     for (int i = 1; i < lengthOfText; i++)
1652 22 May 07 gregory 728       // And have "1" here (not "0")
741 10 Oct 06 olle 729       strBuf.append(txt);
741 10 Oct 06 olle 730     System.out.println(strBuf.toString());
741 10 Oct 06 olle 731   }
741 10 Oct 06 olle 732
1652 22 May 07 gregory 733   private static String returnNiceText(String txt, int lengthOfText) {
1652 22 May 07 gregory 734     StringBuffer strBuf = new StringBuffer("## " + txt);
1652 22 May 07 gregory 735     int forGoUntil = lengthOfText - txt.length(); // Optimization...
1652 22 May 07 gregory 736     for (int i = 0; i < forGoUntil; i++)
741 10 Oct 06 olle 737       strBuf.append(" ");
741 10 Oct 06 olle 738     strBuf.append(" ##");
741 10 Oct 06 olle 739     return strBuf.toString();
741 10 Oct 06 olle 740   }
741 10 Oct 06 olle 741
1652 22 May 07 gregory 742   private static String returnManyChar(String txt, int lengthOfText) {
1652 22 May 07 gregory 743     StringBuffer strBuf = new StringBuffer(txt); // Add the first txt
1652 22 May 07 gregory 744                             // here....
1652 22 May 07 gregory 745                             // //Optimization...
1652 22 May 07 gregory 746     for (int i = 1; i < lengthOfText; i++)
1652 22 May 07 gregory 747       // And have "1" here (not "0")
741 10 Oct 06 olle 748       strBuf.append(txt);
741 10 Oct 06 olle 749
741 10 Oct 06 olle 750     return strBuf.toString();
741 10 Oct 06 olle 751   }
741 10 Oct 06 olle 752
1652 22 May 07 gregory 753   public static String getXerverName() {
741 10 Oct 06 olle 754     return s_xerverName;
741 10 Oct 06 olle 755   }
741 10 Oct 06 olle 756
1652 22 May 07 gregory 757   public static double getThisVersion() {
741 10 Oct 06 olle 758     return thisVersion;
741 10 Oct 06 olle 759   }
741 10 Oct 06 olle 760
1652 22 May 07 gregory 761   public static String getThisVersionString() {
741 10 Oct 06 olle 762     return thisVersionString;
741 10 Oct 06 olle 763   }
741 10 Oct 06 olle 764 }