package com.limegroup.gnutella.messages.vendor;
import org.limewire.security.MACCalculatorRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.messages.BadPacketException;
import com.limegroup.gnutella.messages.Message.Network;
import com.limegroup.gnutella.messages.vendor.VendorMessageFactory.VendorMessageParser;
@Singleton
public class VendorMessageParserBinderImpl implements VendorMessageParserBinder {
private final ReplyNumberVendorMessageFactory replyNumberVendorMessageFactory;
private final HeadPongFactory headPongFactory;
private final MACCalculatorRepositoryManager macManager;
@Inject
public VendorMessageParserBinderImpl(ReplyNumberVendorMessageFactory replyNumberVendorMessageFactory,
HeadPongFactory headPongFactory,
MACCalculatorRepositoryManager macManager) {
this.replyNumberVendorMessageFactory = replyNumberVendorMessageFactory;
this.headPongFactory = headPongFactory;
this.macManager = macManager;
}
public void bind(VendorMessageFactory vendorMessageFactory) {
vendorMessageFactory.setParser(VendorMessage.F_HOPS_FLOW, VendorMessage.F_BEAR_VENDOR_ID, new HopsFlowVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_LIME_ACK, VendorMessage.F_LIME_VENDOR_ID, new LimeACKVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_REPLY_NUMBER, VendorMessage.F_LIME_VENDOR_ID, new ReplyNumberVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_TCP_CONNECT_BACK, VendorMessage.F_BEAR_VENDOR_ID, new TCPConnectBackVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_MESSAGES_SUPPORTED, VendorMessage.F_NULL_VENDOR_ID, new MessagesSupportedVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_UDP_CONNECT_BACK, VendorMessage.F_GTKG_VENDOR_ID, new UDPConnectBackVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_PUSH_PROXY_REQ, VendorMessage.F_LIME_VENDOR_ID, new PushProxyRequestParser());
vendorMessageFactory.setParser(VendorMessage.F_PUSH_PROXY_ACK, VendorMessage.F_LIME_VENDOR_ID, new PushProxyAcknowledgementParser());
vendorMessageFactory.setParser(VendorMessage.F_LIME_ACK, VendorMessage.F_BEAR_VENDOR_ID, new QueryStatusRequestParser());
vendorMessageFactory.setParser(VendorMessage.F_REPLY_NUMBER, VendorMessage.F_BEAR_VENDOR_ID, new QueryStatusResponseParser());
vendorMessageFactory.setParser(VendorMessage.F_TCP_CONNECT_BACK, VendorMessage.F_LIME_VENDOR_ID, new TCPConnectBackRedirectParser());
vendorMessageFactory.setParser(VendorMessage.F_UDP_CONNECT_BACK_REDIR, VendorMessage.F_LIME_VENDOR_ID, new UDPConnectBackRedirectParser());
vendorMessageFactory.setParser(VendorMessage.F_CAPABILITIES, VendorMessage.F_NULL_VENDOR_ID, new CapabilitiesVMParser());
vendorMessageFactory.setParser(VendorMessage.F_SIMPP_REQ, VendorMessage.F_LIME_VENDOR_ID, new SimppRequestVMParser());
vendorMessageFactory.setParser(VendorMessage.F_SIMPP, VendorMessage.F_LIME_VENDOR_ID, new SimppVMParser());
vendorMessageFactory.setParser(VendorMessage.F_CRAWLER_PING, VendorMessage.F_LIME_VENDOR_ID, new UDPCrawlerPingParser());
vendorMessageFactory.setParser(VendorMessage.F_UDP_HEAD_PING, VendorMessage.F_LIME_VENDOR_ID, new HeadPingParser());
vendorMessageFactory.setParser(VendorMessage.F_UDP_HEAD_PONG, VendorMessage.F_LIME_VENDOR_ID, new HeadPongParser());
vendorMessageFactory.setParser(VendorMessage.F_UPDATE_REQ, VendorMessage.F_LIME_VENDOR_ID, new UpdateRequestParser());
vendorMessageFactory.setParser(VendorMessage.F_UPDATE_RESP, VendorMessage.F_LIME_VENDOR_ID, new UpdateResponseParser());
vendorMessageFactory.setParser(VendorMessage.F_CONTENT_REQ, VendorMessage.F_LIME_VENDOR_ID, new ContentRequestParser());
vendorMessageFactory.setParser(VendorMessage.F_CONTENT_RESP, VendorMessage.F_LIME_VENDOR_ID, new ContentResponseParser());
vendorMessageFactory.setParser(VendorMessage.F_HEADER_UPDATE, VendorMessage.F_LIME_VENDOR_ID, new HeaderUpdateVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_OOB_PROXYING_CONTROL, VendorMessage.F_LIME_VENDOR_ID, new OOBProxyControlVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_INSPECTION_REQ, VendorMessage.F_LIME_VENDOR_ID, new InspectionRequestVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_ADVANCED_TOGGLE, VendorMessage.F_LIME_VENDOR_ID, new AdvancedStatsToggleVendorMessageParser());
vendorMessageFactory.setParser(VendorMessage.F_DHT_CONTACTS, VendorMessage.F_LIME_VENDOR_ID, new DHTContactsMessageParser(macManager));
}
// HOPS FLOW MESSAGE
private static class HopsFlowVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new HopsFlowVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
// LIME ACK MESSAGE
private static class LimeACKVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new LimeACKVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
// REPLY NUMBER MESSAGE
private class ReplyNumberVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return replyNumberVendorMessageFactory.createFromNetwork(guid, ttl,
hops, version, restOf, network);
}
}
// TCP CONNECT BACK
private static class TCPConnectBackVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new TCPConnectBackVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
// Messages Supported Message
private static class MessagesSupportedVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new MessagesSupportedVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
// UDP CONNECT BACK
private static class UDPConnectBackVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new UDPConnectBackVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
// Push Proxy Request
private static class PushProxyRequestParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new PushProxyRequest(guid, ttl, hops, version, restOf, network);
}
}
// Push Proxy Acknowledgement
private static class PushProxyAcknowledgementParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new PushProxyAcknowledgement(guid, ttl, hops, version, restOf, network);
}
}
// Query Status Request
private static class QueryStatusRequestParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new QueryStatusRequest(guid, ttl, hops, version, restOf, network);
}
}
// Query Status Response
private static class QueryStatusResponseParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new QueryStatusResponse(guid, ttl, hops, version, restOf, network);
}
}
private static class TCPConnectBackRedirectParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new TCPConnectBackRedirect(guid, ttl, hops, version, restOf, network);
}
}
private static class UDPConnectBackRedirectParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new UDPConnectBackRedirect(guid, ttl, hops, version, restOf, network);
}
}
private static class CapabilitiesVMParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new CapabilitiesVMImpl(guid, ttl, hops, version, restOf, network);
}
}
private static class SimppRequestVMParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new SimppRequestVM(guid, ttl, hops, version, restOf, network);
}
}
private static class SimppVMParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new SimppVM(guid, ttl, hops, version, restOf, network);
}
}
private static class UDPCrawlerPingParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new UDPCrawlerPing(guid, ttl, hops, version, restOf, network);
}
}
private static class HeadPingParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new HeadPing(guid, ttl, hops, version, restOf, network);
}
}
private class HeadPongParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return headPongFactory.createFromNetwork(guid,
ttl, hops, version, restOf, network);
}
}
private static class UpdateRequestParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new UpdateRequest(guid, ttl, hops, version, restOf, network);
}
}
private static class UpdateResponseParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new UpdateResponse(guid, ttl, hops, version, restOf, network);
}
}
private static class ContentRequestParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new ContentRequest(guid, ttl, hops, version, restOf, network);
}
}
private static class ContentResponseParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new ContentResponse(guid, ttl, hops, version, restOf, network);
}
}
private static class HeaderUpdateVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new HeaderUpdateVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
private static class OOBProxyControlVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new OOBProxyControlVendorMessage(guid, ttl, hops, version, restOf, network);
}
}
private static class InspectionRequestVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new InspectionRequestImpl(guid, ttl, hops, version, restOf, network);
}
}
private static class AdvancedStatsToggleVendorMessageParser implements VendorMessageParser {
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new AdvancedStatsToggle(guid, ttl, hops, version, restOf, network);
}
}
private static class DHTContactsMessageParser implements VendorMessageParser {
private final MACCalculatorRepositoryManager macManager;
private DHTContactsMessageParser(MACCalculatorRepositoryManager macManager) {
this.macManager = macManager;
}
public VendorMessage parse(byte[] guid, byte ttl, byte hops, int version,
byte[] restOf, Network network) throws BadPacketException {
return new DHTContactsMessage(guid, ttl, hops, version, restOf, network, macManager);
}
}
}