handleError(null, "help/missingplayer.html");
handleError(null, "missingplayer.html");
  public AbstractClient() {    userPreferences = new Preferences();    lastRatedTrack = null;    lastTrackPreviousRank = -1;    File home = new File(System.getProperties().getProperty("user.home"));    File dir = null;    File file = null;    // Check to see if the iRATE directory exists in the user's home.    // This needs to be there.    dir = new File(home, "/irate");    if (!dir.exists()) {      dir.mkdir();    }    // Check to see if the user has a track database directory set in the    // irate.xml file.  If so, this directory should point to the trackdatabase.xml    // file.    String preference = Preferences.getUserDownloadDirectoryPreference();    if (preference != null) {      file = new File(preference);    }    else {      // If they don't have one set, fall back on the home directory.      // If it doesn't exist in either location, then the user will need to fill in the      // registration information.      dir = new File(home, "irate");      file = new File(dir, "trackdatabase.xml");    }    try {      trackDatabase = new TrackDatabase(file);    }    catch (IOException e) {      e.printStackTrace();    }    playerList = new PlayerList();    // Add the client as a player listener on each player.    // If this doesn't make sense in the future, we'll have to look    // at doing this another way.    for (int i = 0; i < playerList.getPlayers().length; ++i) {      playerList.getPlayers()[i].addPlayerListener(this);    }    playListManager = new PlayListManager(trackDatabase);    playThread = new PlayThread(playListManager, playerList);    pluginManager = new PluginManager(this, dir);    if (playerList.getPlayers().length == 0)      handleError(null, "help/missingplayer.html");    playThread.addUpdateListener(this);    downloadThread = new DownloadThread(trackDatabase) {      public void process() throws IOException {        super.process();        // perhapsDisableAccount();      }      public void handleError(String code, String urlString) {        AbstractClient.this.handleError(code, urlString);      }    };    downloadThread.addUpdateListener(new UpdateListener() {      boolean newState = false;      public void actionPerformed() {        setState(downloadThread.getState());        if (downloadThread.getPercentComplete() == 100)          updateTrackTable();      }    });    // If a track database couldn't be loaded from the file system, then we    // need to create a new account.    if (trackDatabase.getNoOfTracks() == 0) {      createNewAccount();    }  }