/*
 *
 * 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 Qpid Gentools v.0.1 - do not modify.
 * Supported AMQP version:
 *   8-0
 */

package org.apache.qpid.framing;

import java.nio.ByteBuffer;

import org.apache.qpid.QpidException;

public class ConnectionSecureOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
{

    public static final int CLASS_ID =  10;
    public static final int METHOD_ID = 21;

    // Fields declared in specification
    private final byte[] _response; // [response]

    public ConnectionSecureOkBody(
            byte[] response
                                 )
    {
        _response = response;
    }

    public int getClazz()
    {
        return CLASS_ID;
    }

    public int getMethod()
    {
        return METHOD_ID;
    }

    public final byte[] getResponse()
    {
        return _response;
    }

    protected int getBodySize()
    {
        int size = 0;
        size += getSizeOf( _response );
        return size;
    }

    public void writeMethodPayload(ByteBuffer buffer)
    {
        writeBytes( buffer, _response );
    }

    public boolean execute(MethodDispatcher dispatcher, int channelId) throws QpidException
	{
        return dispatcher.dispatchConnectionSecureOk(this, channelId);
	}

    public String toString()
    {
        StringBuilder buf = new StringBuilder("[ConnectionSecureOkBodyImpl: ");
        buf.append( "response=" );
        buf.append(  getResponse() == null  ? "null" : java.util.Arrays.toString( getResponse() ) );
        buf.append("]");
        return buf.toString();
    }

    public static void process(final ByteBuffer in, final ServerMethodProcessor dispatcher)
    {
        byte[] response = EncodingUtils.readBytes(in);
        if(!dispatcher.ignoreAllButCloseOk())
        {
            dispatcher.receiveConnectionSecureOk(response);
        }
    }
}
