001package cpw.mods.fml.common.event;
002
003import java.io.File;
004import java.security.CodeSource;
005import java.security.cert.Certificate;
006import java.util.Properties;
007import java.util.logging.Logger;
008
009import cpw.mods.fml.common.FMLLog;
010import cpw.mods.fml.common.LoaderState.ModState;
011import cpw.mods.fml.common.FMLModContainer;
012import cpw.mods.fml.common.ModContainer;
013import cpw.mods.fml.common.ModMetadata;
014import cpw.mods.fml.common.discovery.ASMDataTable;
015
016public class FMLPreInitializationEvent extends FMLStateEvent
017{
018    private ModMetadata modMetadata;
019    private File sourceFile;
020    private File configurationDir;
021    private File suggestedConfigFile;
022    private ASMDataTable asmData;
023    private ModContainer modContainer;
024
025    public FMLPreInitializationEvent(Object... data)
026    {
027        super(data);
028        this.asmData = (ASMDataTable)data[0];
029        this.configurationDir = (File)data[1];
030    }
031
032    @Override
033    public ModState getModState()
034    {
035        return ModState.PREINITIALIZED;
036    }
037
038    @Override
039    public void applyModContainer(ModContainer activeContainer)
040    {
041        this.modContainer = activeContainer;
042        this.modMetadata = activeContainer.getMetadata();
043        this.sourceFile = activeContainer.getSource();
044        this.suggestedConfigFile = new File(configurationDir, activeContainer.getModId()+".cfg");
045    }
046
047    public File getSourceFile()
048    {
049        return sourceFile;
050    }
051
052    public ModMetadata getModMetadata()
053    {
054        return modMetadata;
055    }
056
057    public File getModConfigurationDirectory()
058    {
059        return configurationDir;
060    }
061
062    public File getSuggestedConfigurationFile()
063    {
064        return suggestedConfigFile;
065    }
066
067    public ASMDataTable getAsmData()
068    {
069        return asmData;
070    }
071
072    public Properties getVersionProperties()
073    {
074        if (this.modContainer instanceof FMLModContainer)
075        {
076            return ((FMLModContainer)this.modContainer).searchForVersionProperties();
077        }
078
079        return null;
080    }
081
082    /**
083     * Get a logger instance configured to write to the FML Log as a parent, identified by modid. Handy for mod logging!
084     * Configurations can be applied through the <code>config/logging.properties</code> file, specifying logging levels
085     * for your ModID. Use this!
086     *
087     * @return A logger
088     */
089    public Logger getModLog()
090    {
091        Logger log = Logger.getLogger(modContainer.getModId());
092        log.setParent(FMLLog.getLogger());
093        return log;
094    }
095
096
097    /**
098     * Retrieve the FML signing certificates, if any. Validate these against the
099     * published FML certificates in your mod, if you wish.
100     *
101     * Deprecated because mods should <b>NOT</b> trust this code. Rather
102     * they should copy this, or something like this, into their own mods.
103     *
104     * @return Certificates used to sign FML and Forge
105     */
106    @Deprecated
107    public Certificate[] getFMLSigningCertificates()
108    {
109        CodeSource codeSource = getClass().getClassLoader().getParent().getClass().getProtectionDomain().getCodeSource();
110        Certificate[] certs = codeSource.getCertificates();
111        if (certs == null)
112        {
113            return new Certificate[0];
114        }
115        else
116        {
117            return certs;
118        }
119    }
120}