&{${CLASS}PropertyContentHeader.java}
/*
 *
 * Copyright (c) 2006 The Apache Software Foundation
 *
 * 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.
 *
 */

/*
 * 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;

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}
}
