/* * Created on Feb 11, 2006 * * TODO Nothing yet. */ package org.mbs3.juniuploader.objects.localobjects; import java.io.File; import java.util.prefs.Preferences; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mbs3.juniuploader.jUniUploader; import org.mbs3.juniuploader.util.Prefs; import org.mbs3.juniuploader.util.Util; /** * This class represents a single WoW directory and creates/stores information * about all accounts in the directory. It can also scan for new account directories. * * @see jUniUploader */ public class WDirectory implements Comparable { private static Log log = LogFactory.getLog(WDirectory.class); protected Vector accounts; protected File wowDirectory; public WDirectory (File wowDirectory) { super(); log.trace("creating a new WDirectory item"); if(wowDirectory == null || !wowDirectory.isDirectory()) log.warn("WDirectory constructor called with an invalid directory"); this.accounts = new Vector(); this.wowDirectory = wowDirectory; this.rescanAccounts(); } public boolean isValid() { if(this.accounts == null) return false; else if(this.wowDirectory == null) return false; else if(!this.wowDirectory.exists()) return false; else if(!this.wowDirectory.isDirectory()) return false; return true; } protected void rescanAccounts() { log.trace("Rescanning accounts"); if(!this.isValid()) { log.error("WoW Directory was somehow invalid, cannot scan for accounts"); return; } // empty the accounts list, we're redetecting if(accounts.size() != 0) accounts.removeAllElements(); // detect accounts String accountdir = wowDirectory.getAbsolutePath() + File.separator + "WTF" + File.separator + "Account" + File.separator; File rootdir = new File(accountdir); if(rootdir == null || !rootdir.exists() || !rootdir.isDirectory()) { log.warn("rescanAccounts() thinks Accounts subdirectory was invalid, cannot scan accounts"); return; } // loop through each account in the directory File[] accountsSearch = rootdir.listFiles(); for(int i = 0; i < accountsSearch.length; i++) { if(accountsSearch[i].exists() && accountsSearch[i].isDirectory()) { WAccount wa = new WAccount(accountsSearch[i], this); if(wa.isValid()) { accounts.addElement(wa); log.trace("WDirectory: rescanAccounts() detected account " + accountsSearch[i].getAbsolutePath()); } else { log.trace("WDirectory: rescanAccounts() skipped account " + accountsSearch[i].getAbsolutePath() + ", invalid"); } } } } public final File getFileObject() { if(this.isValid()) { return this.wowDirectory; } log.warn("getFileObject() had to return a null because !isValid()"); return null; } public Vector getAccounts() { if(this.isValid()) { return this.accounts; } log.warn("getAccounts() had to return a null because !isValid()"); return null; } public String toString() { return this.wowDirectory.getAbsolutePath(); } public int compareTo(Object obj) { WDirectory wd = (WDirectory)obj; if(wd.getFileObject() == wowDirectory) return 0; return -1; } public static Vector retrievePreferences() { // we need to fill wowDirectories with data from prefs if there is any Vector wowDirectories = new Vector(); Preferences prefsWoWDirs = Prefs.getPrefs().node("wowdirectories"); try { log.trace("rescanDirectoriesFromPrefs() Preferences found " + prefsWoWDirs.keys().length + " wow dirs stored"); //populate from prefs, don't guess String [] keys = prefsWoWDirs.keys(); for(int i = 0; i < keys.length ; i++) { log.trace("rescanDirectoriesFromPrefs() Restoring preferences key " + keys[i]); File test = new File(keys[i]); if(test != null && test.exists() && test.isDirectory()) { log.trace("LocalSystem() thinks " + test.getAbsolutePath() + " is a candidate for your WoW directory"); WDirectory wd = new WDirectory(test); if(wd.isValid()) { if(wd.isValid()) { log.trace("addWDirectory(File) added " + wd); wowDirectories.addElement(wd); } } else { log.warn("LocalSystem() thinks " + test.getName() + " had some inconsistency, skipping it"); } } } } catch (Exception ex) {} return wowDirectories; } public static void storePreferences(Vector wowDirectories) { Preferences prefsWoWDirs = Prefs.getPrefs().node("wowdirectories"); try { prefsWoWDirs.removeNode(); prefsWoWDirs = Prefs.getPrefs().node("wowdirectories"); log.trace("storePreferences() storing " + wowDirectories.size() + " directories"); for(int i = 0; i < wowDirectories.size(); i++) { WDirectory wd = (WDirectory)wowDirectories.get(i); log.trace("storePreferences() saving preferences key " + wd.getFileObject().getAbsolutePath()); if(wd.isValid()) { prefsWoWDirs.put(wd.toString(), wd.toString()); } } } catch (Exception ex) { log.error("storePreferences() failture while storing preferences", ex); } } public static Vector rescanDirectories() { org.mbs3.juniuploader.StatusThread.addMessage("Scanning for WoW Directories"); log.trace("rescanDirectories() called"); String [] initialDirectorySuggestions = { "C:/Program Files/World of Warcraft", "/Applications/World of Warcraft", "D:/Program Files/World of Warcraft", }; Vector v = new Vector(); String osUpper = System.getProperty("os.name").toUpperCase(); if(osUpper.startsWith("WINDOWS")) { log.info("rescanDirectories() thinks you're running Windows"); } else if(osUpper.startsWith("MAC OS X")) { log.info("rescanDirectories() thinks you're running OS X"); } else { log.warn("rescanDirectories() has no idea what OS you're running"); } int added = 0; for(int i = 0; i < initialDirectorySuggestions.length; i++) { File test = new File(initialDirectorySuggestions[i]); if(test != null && test.exists() && test.isDirectory()) { log.trace("rescanDirectories() thinks " + test.getAbsolutePath() + " is a candidate for your WoW directory"); WDirectory wd = new WDirectory(test); if(wd.isValid()) { v.addElement(wd); added++; } else { log.warn("rescanDirectories() thinks " + test.getName() + " had some inconsistency, skipping it"); } } } log.info("rescanDirectories() added " + added + " possible WoW Directories"); return v; } public void launch() { Runtime rt = Runtime.getRuntime(); try { if(Util.isMac()) rt.exec(this.wowDirectory.getAbsolutePath() + File.separator + "World of Warcraft.app"); else rt.exec(this.wowDirectory.getAbsolutePath() + File.separator + "WoW.exe"); } catch (Exception ex) { log.error("Failed to launch WoW"); log.error(ex); } } }