#ifndef __message_private_h__
#define __message_private_h__ 1
/*
 * 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.
 */

#include "qpid/dispatch/alloc.h"
#include "qpid/dispatch/atomic.h"
#include "qpid/dispatch/message.h"
#include "qpid/dispatch/threading.h"

typedef struct qd_message_pvt_t qd_message_pvt_t;

/** @file
 * Message representation.
 * 
 * Architecture of the message module:
 *
 *     +--------------+            +----------------------+
 *     |              |            |                      |
 *     | qd_message_t |----------->| qd_message_content_t |
 *     |              |     +----->|                      |
 *     +--------------+     |      +----------------------+
 *                          |                |
 *     +--------------+     |                |    +-------------+   +-------------+   +-------------+
 *     |              |     |                +--->| qd_buffer_t |-->| qd_buffer_t |-->| qd_buffer_t |--/
 *     | qd_message_t |-----+                     +-------------+   +-------------+   +-------------+
 *     |              |
 *     +--------------+
 *
 * The message module provides chained-fixed-sized-buffer storage of message content with multiple
 * references.  If a message is received and is to be queued for multiple destinations, there is only
 * one copy of the message content in memory but multiple lightweight references to the content.
 *
 * @internal
 * @{ 
 */

typedef struct {
    qd_buffer_t *buffer;     // Buffer that contains the first octet of the field, null if the field is not present
    size_t       offset;     // Offset in the buffer to the first octet of the header
    size_t       length;     // Length of the field or zero if unneeded
    size_t       hdr_length; // Length of the field's header (not included in the length of the field)
    bool         parsed;     // True iff the buffer chain has been parsed to find this field
    uint8_t      tag;        // Type tag of the field
} qd_field_location_t;


struct qd_message_stream_data_t {
    DEQ_LINKS(qd_message_stream_data_t);  // Linkage to form a DEQ
    qd_message_pvt_t    *owning_message;  // Pointer to the owning message
    qd_field_location_t  section;         // Section descriptor for the field
    qd_field_location_t  payload;         // Descriptor for the payload of the body data
    qd_buffer_t         *last_buffer;     // Pointer to the last buffer in the field
    bool                 free_prev;       // true if old body_data buffer needs freeing
};

ALLOC_DECLARE(qd_message_stream_data_t);
DEQ_DECLARE(qd_message_stream_data_t, qd_message_stream_data_list_t);


typedef struct {
    qd_message_q2_unblocked_handler_t  handler;
    qd_alloc_safe_ptr_t                context;
} qd_message_q2_unblocker_t;


// TODO - consider using pointers to qd_field_location_t below to save memory
// TODO - provide a way to allocate a message without a lock for the link-routing case.
//        It's likely that link-routing will cause no contention for the message content.
//

typedef struct {
    sys_mutex_t         *lock;
    sys_atomic_t         ref_count;                       // The number of messages referencing this
    qd_buffer_list_t     buffers;                         // The buffer chain containing the message
    qd_buffer_t         *pending;                         // Buffer owned by and filled by qd_message_receive
    uint64_t             buffers_freed;                   // count of large msg buffers freed on send

    qd_field_location_t  section_message_header;          // The message header list
    qd_field_location_t  section_delivery_annotation;     // The delivery annotation map
    qd_field_location_t  section_message_annotation;      // The message annotation map
    qd_field_location_t  section_message_properties;      // The message properties list
    qd_field_location_t  section_application_properties;  // The application properties list
    qd_field_location_t  section_body;                    // The message body: Data
    qd_field_location_t  section_footer;                  // The footer
    qd_field_location_t  field_user_annotations;          // Opaque user message annotations, not a real field.

    qd_field_location_t  field_message_id;                // The string value of the message-id
    qd_field_location_t  field_user_id;                   // The string value of the user-id
    qd_field_location_t  field_to;                        // The string value of the to field
    qd_field_location_t  field_subject;                   // The string value of the subject field
    qd_field_location_t  field_reply_to;                  // The string value of the reply_to field
    qd_field_location_t  field_correlation_id;            // The string value of the correlation_id field
    qd_field_location_t  field_content_type;
    qd_field_location_t  field_content_encoding;
    qd_field_location_t  field_absolute_expiry_time;
    qd_field_location_t  field_creation_time;
    qd_field_location_t  field_group_id;
    qd_field_location_t  field_group_sequence;
    qd_field_location_t  field_reply_to_group_id;

    qd_buffer_t         *parse_buffer;                    // Pointer to the buffer where parsing should resume, if needed
    unsigned char       *parse_cursor;                    // Pointer to octet in parse_buffer where parsing should resume, if needed
    qd_message_depth_t   parse_depth;                     // The depth to which this message content has been parsed
    qd_iterator_t       *ma_field_iter_in;                // 'message field iterator' for msg.FIELD_MESSAGE_ANNOTATION

    qd_iterator_pointer_t ma_user_annotation_blob;        // Original user annotations
                                                          // with router annotations stripped
    uint32_t             ma_count;                        // Number of map elements in blob
                                                          // after the router fields stripped
    qd_parsed_field_t   *ma_pf_ingress;
    qd_parsed_field_t   *ma_pf_phase;
    qd_parsed_field_t   *ma_pf_to_override;
    qd_parsed_field_t   *ma_pf_trace;
    int                  ma_int_phase;
    bool                 ma_stream;                      // indicates whether this message is streaming
    uint64_t             max_message_size;               // configured max; 0 if no max to enforce
    uint64_t             bytes_received;                 // bytes returned by pn_link_recv() when enforcing max_message_size
    uint32_t             fanout;                         // The number of receivers for this message, including in-process subscribers.

    qd_message_q2_unblocker_t q2_unblocker;              // callback and context to signal Q2 unblocked to receiver

    bool                 ma_parsed;                      // have parsed annotations in incoming message
    bool                 discard;                        // Should this message be discarded?
    bool                 receive_complete;               // true if the message has been completely received, false otherwise
    bool                 q2_input_holdoff;               // hold off calling pn_link_recv
    bool                 aborted;                        // receive completed with abort flag set
    bool                 disable_q2_holdoff;             // Disable the Q2 flow control
    bool                 priority_parsed;
    bool                 priority_present;
    bool                 oversize;                       // policy oversize handling in effect
    bool                 no_body;                        // Used for http2 messages. If no_body is true, the HTTP request had no body
    uint8_t              priority;                       // The priority of this message
} qd_message_content_t;

struct qd_message_pvt_t {
    qd_iterator_pointer_t          cursor;          // A pointer to the current location of the outgoing byte stream.
    qd_message_depth_t             message_depth;   // What is the depth of the message that has been received so far
    qd_message_depth_t             sent_depth;      // How much of the message has been sent?  QD_DEPTH_NONE means nothing has been sent so far, QD_DEPTH_HEADER means the header has already been sent, dont send it again and so on.
    qd_message_content_t          *content;         // The actual content of the message. The content is never copied
    qd_buffer_list_t               ma_to_override;  // to field in outgoing message annotations.
    qd_buffer_list_t               ma_trace;        // trace list in outgoing message annotations
    qd_buffer_list_t               ma_ingress;      // ingress field in outgoing message annotations
    int                            ma_phase;        // phase for the override address
    qd_message_stream_data_list_t  stream_data_list;  // TODO - move this to the content for one-time parsing (TLR)
    unsigned char                 *body_cursor;     // tracks the point in the content buffer chain
    qd_buffer_t                   *body_buffer;     // to parse the next body data section (if it exists)
    bool                           strip_annotations_in;
    bool                           send_complete;   // Has the message been completely received and completely sent?
    bool                           tag_sent;        // Tags are sent
    bool                           is_fanout;       // If msg is an outgoing fanout
};

ALLOC_DECLARE(qd_message_t);
ALLOC_DECLARE(qd_message_content_t);

#define MSG_CONTENT(m) (((qd_message_pvt_t*) m)->content)

/** Initialize logging */
void qd_message_initialize();

#define QDR_N_PRIORITIES     10
#define QDR_MAX_PRIORITY     (QDR_N_PRIORITIES - 1)
#define QDR_DEFAULT_PRIORITY  4

///@}

#endif
