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

namespace Qpid.Codec.Demux
{
    public interface IMessageEncoder
    {
        /// <summary>
        /// Returns the set of message classes this encoder can encode.
        /// </summary>
        Hashtable MessageTypes
        {
            get;
        }

        /// <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>
        /// <exception cref="Exception">if the message violated protocol specification</exception>
        void Encode(Object message, IProtocolEncoderOutput output);
    }
}

