using System; using System.Collections; using System.Text; using Qpid.Framing; using Qpid.Messaging; namespace Qpid.Client.Message { internal class QpidHeaders : IHeaders { public const char BOOLEAN_PROPERTY_PREFIX = 'B'; public const char BYTE_PROPERTY_PREFIX = 'b'; public const char SHORT_PROPERTY_PREFIX = 's'; public const char INT_PROPERTY_PREFIX = 'i'; public const char LONG_PROPERTY_PREFIX = 'l'; public const char FLOAT_PROPERTY_PREFIX = 'f'; public const char DOUBLE_PROPERTY_PREFIX = 'd'; public const char STRING_PROPERTY_PREFIX = 'S'; AbstractQmsMessage _message; public QpidHeaders(AbstractQmsMessage message) { _message = message; } public bool Contains(string name) { CheckPropertyName(name); if (_message.ContentHeaderProperties.Headers == null) { return false; } else { // TODO: fix this return _message.ContentHeaderProperties.Headers.Contains(STRING_PROPERTY_PREFIX + name); } } public void Clear() { if (_message.ContentHeaderProperties.Headers != null) { _message.ContentHeaderProperties.Headers.Clear(); } } public string this[string name] { get { return GetString(name); } set { SetString(name, value); } } public bool GetBoolean(string name) { CheckPropertyName(name); if (_message.ContentHeaderProperties.Headers == null) { return false; } else { object b = _message.ContentHeaderProperties.Headers[BOOLEAN_PROPERTY_PREFIX + name]; if (b == null) { return false; } else { return (bool)b; } } } public void SetBoolean(string name, bool b) { CheckPropertyName(name); _message.ContentHeaderProperties.Headers[BOOLEAN_PROPERTY_PREFIX + name] = b; } public byte GetByte(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object b = _message.ContentHeaderProperties.Headers[BYTE_PROPERTY_PREFIX + propertyName]; if (b == null) { return 0; } else { return (byte)b; } } } public void SetByte(string propertyName, byte b) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[BYTE_PROPERTY_PREFIX + propertyName] = b; } public short GetShort(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object s = _message.ContentHeaderProperties.Headers[SHORT_PROPERTY_PREFIX + propertyName]; if (s == null) { return 0; } else { return (short)s; } } } public void SetShort(string propertyName, short i) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[SHORT_PROPERTY_PREFIX + propertyName] = i; } public int GetInt(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object i = _message.ContentHeaderProperties.Headers[INT_PROPERTY_PREFIX + propertyName]; if (i == null) { return 0; } else { return (int)i; } } } public void SetInt(string propertyName, int i) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[INT_PROPERTY_PREFIX + propertyName] = i; } public long GetLong(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object l = _message.ContentHeaderProperties.Headers[LONG_PROPERTY_PREFIX + propertyName]; if (l == null) { // temp - the spec says do this but this throws a NumberFormatException //return Long.valueOf(null).longValue(); return 0; } else { return (long)l; } } } public void SetLong(string propertyName, long l) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[LONG_PROPERTY_PREFIX + propertyName] = l; } public float GetFloat(String propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object f = _message.ContentHeaderProperties.Headers[FLOAT_PROPERTY_PREFIX + propertyName]; if (f == null) { return 0; } else { return (float)f; } } } public void SetFloat(string propertyName, float f) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[FLOAT_PROPERTY_PREFIX + propertyName] = f; } public double GetDouble(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return 0; } else { object d = _message.ContentHeaderProperties.Headers[DOUBLE_PROPERTY_PREFIX + propertyName]; if (d == null) { return 0; } else { return (double)d; } } } public void SetDouble(string propertyName, double v) { CheckPropertyName(propertyName); _message.ContentHeaderProperties.Headers[DOUBLE_PROPERTY_PREFIX + propertyName] = v; } public string GetString(string propertyName) { CheckPropertyName(propertyName); if (_message.ContentHeaderProperties.Headers == null) { return null; } else { return (string)_message.ContentHeaderProperties.Headers[STRING_PROPERTY_PREFIX + propertyName]; } } public void SetString(string propertyName, string value) { CheckPropertyName(propertyName); CreatePropertyMapIfRequired(); propertyName = STRING_PROPERTY_PREFIX + propertyName; _message.ContentHeaderProperties.Headers[propertyName] = value; } private void CheckPropertyName(string propertyName) { if (propertyName == null) { throw new ArgumentException("Property name must not be null"); } else if ("".Equals(propertyName)) { throw new ArgumentException("Property name must not be the empty string"); } if (_message.ContentHeaderProperties.Headers == null) { _message.ContentHeaderProperties.Headers = new FieldTable(); } } private void CreatePropertyMapIfRequired() { if (_message.ContentHeaderProperties.Headers == null) { _message.ContentHeaderProperties.Headers = new FieldTable(); } } public override string ToString() { StringBuilder buf = new StringBuilder("{"); int i = 0; foreach (DictionaryEntry entry in _message.ContentHeaderProperties.Headers) { ++i; if (i > 1) { buf.Append(", "); } string propertyName = (string)entry.Key; if (propertyName == null) { buf.Append("\nInternal error: Property with NULL key defined"); } else { buf.Append(propertyName.Substring(1)); buf.Append(" : "); char typeIdentifier = propertyName[0]; buf.Append(typeIdentifierToName(typeIdentifier)); buf.Append(" = ").Append(entry.Value); } } buf.Append("}"); return buf.ToString(); } private static string typeIdentifierToName(char typeIdentifier) { switch (typeIdentifier) { case BOOLEAN_PROPERTY_PREFIX: return "boolean"; case BYTE_PROPERTY_PREFIX: return "byte"; case SHORT_PROPERTY_PREFIX: return "short"; case INT_PROPERTY_PREFIX: return "int"; case LONG_PROPERTY_PREFIX: return "long"; case FLOAT_PROPERTY_PREFIX: return "float"; case DOUBLE_PROPERTY_PREFIX: return "double"; case STRING_PROPERTY_PREFIX: return "string"; default: return "unknown ( '" + typeIdentifier + "')"; } } } }