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