/*
 *
 * 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.
 *
 */
using System;

namespace Qpid.Codec
{
    public interface IProtocolEncoder : IDisposable
    {
        /// <summary>
        /// Encodes higher-level message objects into binary or protocol-specific data.
        /// MINA invokes {@link #encode(IoSession, Object, ProtocolEncoderOutput)}
        /// method with message which is popped from the session write queue, and then
        /// the encoder implementation puts encoded {@link ByteBuffer}s into
        /// {@link ProtocolEncoderOutput}.
        /// </summary>
        /// <param name="message"></param>
        /// <param name="output"></param>
        /// <exception cref="Exception">if the message violated protocol specification</exception>
        void Encode(Object message, IProtocolEncoderOutput output);
    }
}

