#ifndef __trace_mask_h__
#define __trace_mask_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/dispatch.h>
#include <qpid/dispatch/parse.h>
#include <qpid/dispatch/bitmask.h>

typedef struct qd_tracemask_t qd_tracemask_t;

/**
 * qd_tracemask
 *
 * Create a TraceMask object.
 */
qd_tracemask_t *qd_tracemask(void);

/**
 * qd_tracemask_free
 *
 * Destroy a TraceMask object and free its allocated resources.
 */
void qd_tracemask_free(qd_tracemask_t *tm);

/**
 * qd_tracemask_add_router
 *
 * Notify the TraceMask of a new router and its assigned mask bit.
 *
 * @param tm Tracemask created by qd_tracemask()
 * @param address The address of the remote router as reported by the router module.
 * @param maskbit The mask bit assigned to this router by the router module.
 */
void qd_tracemask_add_router(qd_tracemask_t *tm, const char *address, int maskbit);

/**
 * qd_tracemask_del_router
 *
 * Notify the TraceMask of the removal of a router.
 *
 * @param tm Tracemask created by qd_tracemask()
 * @param maskbit The mask bit assigned to this router by the router module.
 */
void qd_tracemask_del_router(qd_tracemask_t *tm, int maskbit);

/**
 * qd_tracemask_set_link
 *
 * Notify the TraceMask of a link connected to a neighbor router.
 *
 * @param tm Tracemask created by qd_tracemask()
 * @param router_maskbit The mask bit assigned to this router by the router module.
 * @param link_maskbit The mask bit assigned to the link by the router core.
 */
void qd_tracemask_set_link(qd_tracemask_t *tm, int router_maskbit, int link_maskbit);

/**
 * qd_tracemask_remove_link
 *
 * Notify the TraceMask of a disconnected neighbor router.
 *
 * @param tm Tracemask created by qd_tracemask()
 * @param router_maskbit The mask bit assigned to this router by the router module.
 */
void qd_tracemask_remove_link(qd_tracemask_t *tm, int router_maskbit);

/**
 * qd_tracemask_create
 *
 * Create a new bitmask with a bit set for every outgoing link to a neighbor mentioned
 * in the trace list.
 *
 * @param tm Tracemask created by qd_tracemask()
 * @param tracelist The parsed field from a message's trace header
 * @param ingress_index (out) The mask-bit for the first router in the trace list (the ingress router)
 * @return A new bit mask with a set-bit for each neighbor router in the list.  This must be freed
 *         by the caller when the caller is done with it.
 */
qd_bitmask_t *qd_tracemask_create(qd_tracemask_t *tm, qd_parsed_field_t *tracelist, int *ingress_index);

#endif
