package com.digitalpetri.enip.commands;
import java.util.Optional;
import com.digitalpetri.enip.cpf.CipIdentityItem;
import com.digitalpetri.enip.cpf.CpfItem;
import com.digitalpetri.enip.cpf.CpfPacket;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.DecoderException;
public final class ListIdentity extends Command {
public static final CommandCode COMMAND_CODE = CommandCode.ListIdentity;
private final Optional<CipIdentityItem> identity;
public ListIdentity() {
this(null);
}
public ListIdentity(CipIdentityItem identity) {
super(COMMAND_CODE);
this.identity = Optional.ofNullable(identity);
}
public Optional<CipIdentityItem> getIdentity() {
return identity;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ListIdentity that = (ListIdentity) o;
return identity.equals(that.identity);
}
@Override
public int hashCode() {
return identity.hashCode();
}
public static ByteBuf encode(ListIdentity command, ByteBuf buffer) {
command.getIdentity().ifPresent(identity -> CpfPacket.encode(new CpfPacket(identity), buffer));
return buffer;
}
public static ListIdentity decode(ByteBuf buffer) {
if (buffer.readableBytes() > 0) {
CpfPacket packet = CpfPacket.decode(buffer);
CpfItem[] items = packet.getItems();
if (items.length > 0) {
if (items[0] instanceof CipIdentityItem) {
return new ListIdentity((CipIdentityItem) items[0]);
} else {
throw new DecoderException(
String.format("expected CipIdentityItem; received %s instead",
items[0].getClass().getSimpleName()));
}
} else {
return new ListIdentity();
}
}
return new ListIdentity();
}
}