blob: a77afed6383d91db8112dec533e7d90156b2be0b [file] [log] [blame]
/*
* 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.Generic;
using Apache.Qpid.Proton.Buffer;
using Apache.Qpid.Proton.Types.Messaging;
namespace Apache.Qpid.Proton.Client
{
/// <summary>
/// A single AMQP Message instance used by senders and receivers to provide a lower
/// level abstraction around an AMQP message than the basic IMessage type but still
/// provides the IMessage interface simpler access where needed.
/// </summary>
/// <typeparam name="T">The type that comprises the message body</typename>
public interface IAdvancedMessage<T> : IMessage<T>
{
/// <summary>
/// Creates a new advanced message instance using the Proton implementation.
/// </summary>
/// <returns>A new advanced message instance.</returns>
static new IAdvancedMessage<T> Create() => IMessage<T>.Create() as IAdvancedMessage<T>;
/// <summary>
/// Provides access to the AMQP Header instance that is carried in the message.
/// </summary>
Header Header { get; set; }
/// <summary>
/// Provides access to the AMQP Properties instance that is carried in the message.
/// </summary>
Properties Properties { get; set; }
/// <summary>
/// Provides access to the AMQP MessageAnnotations instance that is carried in the message.
/// </summary>
MessageAnnotations Annotations { get; set; }
/// <summary>
/// Provides access to the AMQP ApplicationProperties instance that is carried in the message.
/// </summary>
ApplicationProperties ApplicationProperties { get; set; }
/// <summary>
/// Provides access to the AMQP Footer instance that is carried in the message.
/// </summary>
Footer Footer { get; set; }
/// <summary>
/// Access the message format value present in this message. The exact structure of a
/// message, together with its encoding, is defined by the message format (default is
/// the AMQP defined message format zero.
/// <para>
/// This field MUST be specified for the first transfer of a streamed message, if
/// it is not set at the time of send of the first transfer the sender uses the AMQP
/// default value of zero for this field.
/// </para>
/// <para>
/// The upper three octets of a message format code identify a particular message format.
/// The lowest octet indicates the version of said message format. Any given version of
/// a format is forwards compatible with all higher versions.
/// </para>
/// </summary>
uint MessageFormat { get; set; }
/// <summary>
/// Adds the given section to the internal collection of sections that will be sent
/// to the remote peer when this message is encoded. If a previous section was added by
/// a call to the set body method it should be retained as the first element of the
/// running list of body sections contained in this message.
/// </summary>
/// <remarks>
/// The implementation should make an attempt to validate that sections added are valid
/// for the message format that is assigned when they are added.
/// </remarks>
/// <param name="section">The section to add to the collection of sections in this message</param>
/// <returns>This advanced message instance.</returns>
IAdvancedMessage<T> AddBodySection(ISection section);
/// <summary>
/// Sets the body section instances to use when encoding this message. The value set
/// replaces any existing sections assigned to this message through the add body sections
/// API or the singular body set method. Calling the set method with a null or empty
/// enumerable is equivalent to calling the clear body sections method. The values from the
/// passed enumerable are copied and changes to it following calls to this method are not
/// reflected in the collection contained in this message.
/// </summary>
/// <param name="sections">The collection of body sections to assign to this message</param>
/// <returns>This advanced message instance.</returns>
IAdvancedMessage<T> SetBodySections(IEnumerable<ISection> section);
/// <summary>
/// Create and return an unmodifiable read-only view that contains the section instances
/// currently assigned to this message.
/// </summary>
/// <returns>a read-only view of the sections in this message's body</returns>
IEnumerable<ISection> GetBodySections();
/// <summary>
/// Clears all currently set body sections from this message instance.
/// </summary>
/// <returns>This advanced message instance.</returns>
IAdvancedMessage<T> ClearBodySections();
/// <summary>
/// Efficient enumeration over all currently assigned body sections in this message.
/// </summary>
/// <param name="consumer">Function to invoke for each section in the message</param>
/// <returns>This advanced message instance.</returns>
IAdvancedMessage<T> ForEachBodySection(Action<ISection> consumer);
/// <summary>
/// Encodes the advanced message for transmission by the client. The provided delivery
/// annotations can be included or augmented by the advanced implementation based on the
/// target message format. The implementation is responsible for ensuring that the delivery
/// annotations are treated correctly encoded into the correct location in the message.
/// </summary>
/// <param name="deliveryAnnotations">Options delivery annotations to encode with the message</param>
/// <returns>The encoded message bytes in a proton buffer instance</returns>
IProtonBuffer Encode(IDictionary<string, object> deliveryAnnotations);
}
}