&{${CLASS}ContentHeaderProperties.java}
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 */

/*
 * This file is auto-generated by ${GENERATOR} - do not modify.
 * Supported AMQP versions:
%{VLIST} *   ${major}-${minor}
 */
 
package org.apache.qpid.framing;

import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;

public class ${CLASS}ContentHeaderProperties implements ContentHeaderProperties
{
    private static final Logger logger = Logger.getLogger(BasicContentHeaderProperties.class);

    /**
     * We store the encoded form when we decode the content header so that if we need to
     * write it out without modifying it we can do so without incurring the expense of
     * reencoding it.
     */
    private byte[] encodedBuffer;

    /**
     * Flag indicating whether the entire content header has been decoded yet.
     */
    private boolean decodedFlag = true;

    /**
     * We have some optimisations for partial decoding for maximum performance. The
     * headers are used in the broker for routing in some cases so we can decode that
     * separately.
     */
    private boolean decodedHeadersFlag = true;

    /**
     * We have some optimisations for partial decoding for maximum performance. The
     * content type is used by all clients to determine the message type.
     */
    private boolean decodedContentTypeFlag = true;

    /**
     * AMQP major and minor version of this instance.
     */
     private byte major;
     private byte minor;
    
    /**
     * Property flags.
     */
    ${pch_property_flags_declare}

    // Header fields from specification
%{FLIST}    ${field_declaration}

    /**
     * Constructor
     */
    public ${CLASS}ContentHeaderProperties(byte major, byte minor)
    {
        this.major = major;
        this.minor = minor;
        
        // Although one flag is initialized per property, the flags are used
        // in ordinal order of the AMQP version represented by this instance,
        // thus the number of flags actually used may be less than the total
        // number defined.
    	${pch_property_flags_initializer}
    }
        
    public int getPropertyListSize()
    {
        if (encodedBuffer != null)
        {
            return encodedBuffer.length;
        }
        else
        {
            int size = 0;
%{FLIST}            ${pch_field_list_size}
            return size;
        }
    }

    private void clearEncodedForm()
    {
        if (!decodedFlag && encodedBuffer != null)
        {
            //decode();
        }
        encodedBuffer = null;
    }

    public void setPropertyFlags(int[] compactPropertyFlags)
        throws AMQProtocolVersionException
    {
        clearEncodedForm();
${pch_compact_property_flags_check}
%{FLIST}            ${pch_set_compact_property_flags}
    }
    
    public int[] getPropertyFlags()
    {
    	int[] compactPropertyFlags = new int[] { 0 };
${pch_compact_property_flags_initializer}
%{FLIST}            ${pch_get_compact_property_flags}
        return compactPropertyFlags;
    }

    public void writePropertyListPayload(ByteBuffer buffer)
    {
        if (encodedBuffer != null)
        {
            buffer.put(encodedBuffer);
        }
        else
        {
%{FLIST}            ${pch_field_list_payload}
        }
    }
    
    public void populatePropertiesFromBuffer(ByteBuffer buffer, int[] propertyFlags, int size)
        throws AMQFrameDecodingException, AMQProtocolVersionException
    {
        setPropertyFlags(propertyFlags);

        if (logger.isDebugEnabled())
        {
            logger.debug("Property flags: " + propertyFlags);
        }
        decode(buffer);
        /*encodedBuffer = new byte[size];
        buffer.get(encodedBuffer, 0, size);
        decodedFlag = false;
        decodedHeadersFlag = false;
        decodedContentTypeFlag = false;*/
    }
    
    private void decode(ByteBuffer buffer)
    {
        //ByteBuffer buffer = ByteBuffer.wrap(encodedBuffer);
        int pos = buffer.position();
        try
        {
%{FLIST}            ${pch_field_list_decode}
	    // This line does nothing, but prevents a compiler error (Exception not thrown)
            // if this block is empty.
            if (false) throw new AMQFrameDecodingException("");
        }
        catch (AMQFrameDecodingException e)
        {
            throw new RuntimeException("Error in content header data: " + e);
        }

        final int endPos = buffer.position();
        buffer.position(pos);
        final int len = endPos - pos;
        encodedBuffer = new byte[len];
        final int limit = buffer.limit();
        buffer.limit(endPos);
        buffer.get(encodedBuffer, 0, len);
        buffer.limit(limit);
        buffer.position(endPos);
        decodedFlag = true;
    }

    private void decodeIfNecessary()
    {
        if (!decodedFlag)
        {
            //decode();
        }
    }

    // Field clear methods
    
%{FLIST}            ${pch_field_clear_methods}

    // Field get methods

%{FLIST}            ${pch_field_get_methods}

    // Field set methods

%{FLIST}            ${pch_field_set_methods}
}
