/*
*
* 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;
using System.Configuration;
using System.Reflection;
using System.Xml;
using log4net;
using Apache.Qpid.Buffer;
using Apache.Qpid.Codec;
using Apache.Qpid.Codec.Demux;
using Apache.Qpid.Common;
namespace Apache.Qpid.Framing
{
public class ProtocolInitiation : IDataBlock, IEncodableAMQDataBlock
{
private static readonly ILog _log = LogManager.GetLogger(typeof(ProtocolInitiation));
public char[] Header = new char[]{'A','M','Q','P'};
private const byte CURRENT_PROTOCOL_CLASS = 1;
private const int CURRENT_PROTOCOL_INSTANCE = 1;
// FIXME: Needs to be tweakable from GRM.dll.config file. i.e. Major version 7 or 8 +
// FIXME: a configuration item for avoiding Basic.Qos (for OpenAMQ compatibility)
public static int CURRENT_PROTOCOL_VERSION_MAJOR = 8; // FIXME: put back to 7 for OpenAMQ!
private const int CURRENT_PROTOCOL_VERSION_MINOR = 0;
public byte ProtocolClass = CURRENT_PROTOCOL_CLASS;
public byte ProtocolInstance = CURRENT_PROTOCOL_INSTANCE;
public byte ProtocolMajor = (byte)CURRENT_PROTOCOL_VERSION_MAJOR;
public byte ProtocolMinor = CURRENT_PROTOCOL_VERSION_MINOR;
static ProtocolInitiation()
{
AssemblySettings settings = new AssemblySettings();
/*
string openAMQ = settings["OpenAMQ1d4Compatibility"];
if (openAMQ.Equals("true"))
{
_log.Warn("Starting in OpenAMQ-1.0d4 compatibility mode. ProtocolMajorVersion is 7 and Basic.Qos will not be sent.");
CURRENT_PROTOCOL_VERSION_MAJOR = 7;
}
*/
}
public uint Size
{
get
{
return 4 + 1 + 1 + 1 + 1;
}
}
public void WritePayload(ByteBuffer buffer)
{
foreach (char c in Header)
{
buffer.Put((byte) c);
}
buffer.Put(ProtocolClass);
buffer.Put(ProtocolInstance);
buffer.Put(ProtocolMajor);
buffer.Put(ProtocolMinor);
}
///
/// Populates from buffer.
///
/// The buffer.
public void PopulateFromBuffer(ByteBuffer buffer)
{
throw new AMQException("Method not implemented");
}
public class Decoder : IMessageDecoder
{
private bool _disabled = false;
public MessageDecoderResult Decodable(ByteBuffer inbuf)
{
if (_disabled)
{
return MessageDecoderResult.NOT_OK;
}
if (inbuf.Remaining < 8)
{
return MessageDecoderResult.NEED_DATA;
}
else
{
char[] expected = new char[]{'A', 'M', 'Q', 'P'};
for (int i = 0; i < 4; i++)
{
if (((char) inbuf.GetByte()) != expected[i])
{
return MessageDecoderResult.NOT_OK;
}
}
return MessageDecoderResult.OK;
}
}
///
/// Decodes the specified session.
///
/// The inbuf.
/// The protocol output.
///
public MessageDecoderResult Decode(ByteBuffer inbuf, IProtocolDecoderOutput output)
{
byte[] header = new byte[4];
inbuf.GetBytes(header);
ProtocolInitiation pi = new ProtocolInitiation();
pi.Header = new char[]{'A','M','Q','P'};
pi.ProtocolClass = inbuf.GetByte();
pi.ProtocolInstance = inbuf.GetByte();
pi.ProtocolMajor = inbuf.GetByte();
pi.ProtocolMinor = inbuf.GetByte();
output.Write(pi);
return MessageDecoderResult.OK;
}
public bool Disabled
{
set
{
_disabled = value;
}
}
}
public override string ToString()
{
return String.Format("{0}{{Class={1} Instance={2} Major={3} Minor={4}}}",
GetType().Name, ProtocolClass, ProtocolInstance, ProtocolMajor, ProtocolMinor);
}
}
}