001package cpw.mods.fml.common.network;
002
003import java.util.List;
004
005import com.google.common.collect.ImmutableList;
006import com.google.common.collect.ImmutableList.Builder;
007import com.google.common.collect.Lists;
008import com.google.common.io.ByteArrayDataInput;
009import com.google.common.io.ByteArrayDataOutput;
010import com.google.common.io.ByteStreams;
011
012import cpw.mods.fml.common.FMLCommonHandler;
013import cpw.mods.fml.common.Loader;
014import cpw.mods.fml.common.ModContainer;
015import cpw.mods.fml.common.versioning.ArtifactVersion;
016import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
017import cpw.mods.fml.common.versioning.VersionRange;
018
019import net.minecraft.network.INetworkManager;
020import net.minecraft.network.packet.NetHandler;
021
022public class ModMissingPacket extends FMLPacket
023{
024
025    private List<ModData> missing;
026    private List<ModData> badVersion;
027
028    public ModMissingPacket()
029    {
030        super(Type.MOD_MISSING);
031    }
032
033    @Override
034    public byte[] generatePacket(Object... data)
035    {
036        ByteArrayDataOutput dat = ByteStreams.newDataOutput();
037
038        List<String> missing = (List<String>) data[0];
039        List<String> badVersion = (List<String>) data[1];
040
041        dat.writeInt(missing.size());
042        for (String missed : missing)
043        {
044            ModContainer mc = Loader.instance().getIndexedModList().get(missed);
045            dat.writeUTF(missed);
046            dat.writeUTF(mc.getVersion());
047        }
048        dat.writeInt(badVersion.size());
049        for (String bad : badVersion)
050        {
051            ModContainer mc = Loader.instance().getIndexedModList().get(bad);
052            dat.writeUTF(bad);
053            dat.writeUTF(mc.getVersion());
054        }
055        return dat.toByteArray();
056    }
057
058    private static class ModData
059    {
060        String modId;
061        String modVersion;
062    }
063    @Override
064    public FMLPacket consumePacket(byte[] data)
065    {
066        ByteArrayDataInput dat = ByteStreams.newDataInput(data);
067        int missingLen = dat.readInt();
068        missing = Lists.newArrayListWithCapacity(missingLen);
069        for (int i = 0; i < missingLen; i++)
070        {
071            ModData md = new ModData();
072            md.modId = dat.readUTF();
073            md.modVersion = dat.readUTF();
074            missing.add(md);
075        }
076        int badVerLength = dat.readInt();
077        badVersion = Lists.newArrayListWithCapacity(badVerLength);
078        for (int i = 0; i < badVerLength; i++)
079        {
080            ModData md = new ModData();
081            md.modId = dat.readUTF();
082            md.modVersion = dat.readUTF();
083            badVersion.add(md);
084        }
085        return this;
086    }
087
088    @Override
089    public void execute(INetworkManager network, FMLNetworkHandler handler, NetHandler netHandler, String userName)
090    {
091        FMLCommonHandler.instance().getSidedDelegate().displayMissingMods(this);
092    }
093
094    public List<ArtifactVersion> getModList()
095    {
096        Builder<ArtifactVersion> builder = ImmutableList.<ArtifactVersion>builder();
097        for (ModData md : missing)
098        {
099            builder.add(new DefaultArtifactVersion(md.modId, VersionRange.createFromVersion(md.modVersion, null)));
100        }
101        for (ModData md : badVersion)
102        {
103            builder.add(new DefaultArtifactVersion(md.modId, VersionRange.createFromVersion(md.modVersion, null)));
104        }
105        return builder.build();
106    }
107
108}