/**
*    Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior
*    University
* 
*    Licensed under the Apache License, Version 2.0 (the "License"); you may
*    not use this file except in compliance with the License. You may obtain
*    a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0
*
*    Unless required by applicable law or agreed to in writing, software
*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
*    License for the specific language governing permissions and limitations
*    under the License.
**/

package org.openflow.protocol;

import org.jboss.netty.buffer.ChannelBuffer;
import org.openflow.protocol.factory.OFVendorDataFactory;
import org.openflow.protocol.factory.OFVendorDataFactoryAware;
import org.openflow.protocol.vendor.OFVendorData;
import org.openflow.util.U16;

/**
 * Represents ofp_vendor_header
 * @author David Erickson (daviderickson@cs.stanford.edu)
 */
public class OFVendor extends OFMessage implements OFVendorDataFactoryAware {
    public static int MINIMUM_LENGTH = 12;

    protected int vendor;
    protected OFVendorData vendorData;
    protected OFVendorDataFactory vendorDataFactory;

    public OFVendor() {
        super();
        this.type = OFType.VENDOR;
        this.length = U16.t(MINIMUM_LENGTH);
    }

    /**
     * @return the vendor
     */
    public int getVendor() {
        return vendor;
    }

    /**
     * @param vendor the vendor to set
     */
    public void setVendor(int vendor) {
        this.vendor = vendor;
    }

    /**
     * @return the data
     */
    public OFVendorData getVendorData() {
        return vendorData;
    }

    /**
     * @param data the data to set
     */
    public void setVendorData(OFVendorData vendorData) {
        this.vendorData = vendorData;
    }

    @Override
    public void setVendorDataFactory(OFVendorDataFactory vendorDataFactory) {
        this.vendorDataFactory = vendorDataFactory;
    }
      
    @Override
    public void readFrom(ChannelBuffer data) {
        super.readFrom(data);
        this.vendor = data.readInt();
        if (vendorDataFactory == null)
            throw new RuntimeException("OFVendorDataFactory not set");
            
        this.vendorData = vendorDataFactory.parseVendorData(vendor,
                data, super.getLengthU() - MINIMUM_LENGTH);
    }

    @Override
    public void writeTo(ChannelBuffer data) {
        super.writeTo(data);
        data.writeInt(this.vendor);
        if (vendorData != null)
            vendorData.writeTo(data);
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 337;
        int result = super.hashCode();
        result = prime * result + vendor;
        if (vendorData != null)
            result = prime * result + vendorData.hashCode();
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        OFVendor other = (OFVendor) obj;
        if (vendor != other.vendor)
            return false;
        if (vendorData == null) {
            if (other.vendorData != null) {
                return false;
            }
        } else if (!vendorData.equals(other.vendorData)) {
            return false;
        }
        return true;
    }
}
