package jnr.posix;

import java.util.ArrayList;
import java.util.List;
import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
import jnr.ffi.StructLayout;

/**
 * @author Bob McWhirter
 */
class FreeBSDMsgHdr extends BaseMsgHdr {

    public static class Layout extends StructLayout {
        protected Layout(Runtime runtime) {
            super(runtime);
        }

        public final Pointer msg_name = new Pointer();
        public final socklen_t msg_namelen = new socklen_t();
        public final Pointer msg_iov = new Pointer();
        public final Signed32 msg_iovlen = new Signed32();
        public final Pointer msg_control = new Pointer();
        public final socklen_t msg_controllen = new socklen_t();
        public final Signed32 msg_flags = new Signed32();
    }

    private static final Layout layout = new Layout(Runtime.getSystemRuntime());

    protected FreeBSDMsgHdr(NativePOSIX posix) {
        super(posix, layout);
        setName(null);
    }

    CmsgHdr allocateCmsgHdrInternal(NativePOSIX posix, Pointer pointer, int len) {
        if (len > 0) {
            return new FreeBSDCmsgHdr(posix, pointer, len);
        } else {
            return new FreeBSDCmsgHdr(posix, pointer);
        }
    }

    @Override
    void setControlPointer(Pointer control) {
        layout.msg_control.set(this.memory, control);
    }

    @Override
    void setControlLen(int len) {
        layout.msg_controllen.set(this.memory, len);
    }

    public String toString() {
        StringBuffer buf = new StringBuffer();
        buf.append("msghdr {\n");
        buf.append("  msg_name=").append(getName()).append(",\n");
        buf.append("  msg_namelen=").append(getNameLen()).append(",\n");

        buf.append("  msg_iov=[\n");
        Pointer iovp = layout.msg_iov.get(this.memory);

        int numIov = getIovLen();
        for (int i = 0; i < numIov; ++i) {
            Pointer eachp = iovp.slice(i * BaseIovec.layout.size());
            buf.append(new BaseIovec(posix, eachp).toString("    "));
            if (i < (numIov - 1)) {
                buf.append(",\n");
            } else {
                buf.append("\n");
            }
        }
        buf.append("  ],\n");

        buf.append("  msg_control=[\n");

        CmsgHdr[] controls = getControls();
        for (int i = 0; i < controls.length; ++i) {
            buf.append(((FreeBSDCmsgHdr) controls[i]).toString("    "));
            if (i < controls.length - 1) {
                buf.append(",\n");
            } else {
                buf.append("\n");
            }
        }
        buf.append("  ],\n");
        buf.append("  msg_controllen=").append(layout.msg_controllen.get(this.memory)).append("\n");

        buf.append("  msg_iovlen=").append(getIovLen()).append(",\n");
        buf.append("  msg_flags=").append(getFlags()).append(",\n");
        buf.append("}");
        return buf.toString();
    }

    @Override
    void setNamePointer(Pointer name) {
        layout.msg_name.set( this.memory, name );
    }

    @Override
    Pointer getNamePointer() {
        return layout.msg_name.get( this.memory );
    }


    @Override
    void setNameLen(int len) {
        layout.msg_namelen.set(this.memory, len);
    }

    @Override
    int getNameLen() {
        return (int) layout.msg_namelen.get(this.memory);
    }

    @Override
    void setIovPointer(Pointer iov) {
        layout.msg_iov.set(this.memory, iov);
    }

    @Override
    Pointer getIovPointer() {
        return layout.msg_iov.get( this.memory );
    }

    @Override
    void setIovLen(int len) {
        layout.msg_iovlen.set(this.memory, len);
    }

    @Override
    int getIovLen() {
        return (int) layout.msg_iovlen.get(this.memory);
    }

    @Override
    Pointer getControlPointer() {
        return layout.msg_control.get(this.memory);
    }

    public int getControlLen() {
        return (int) layout.msg_controllen.get(this.memory);
    }

    public void setFlags(int flags) {
        layout.msg_flags.set(this.memory, flags);
    }

    public int getFlags() {
        return layout.msg_flags.get(this.memory);
    }
}
