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