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

//
// The following declarations are for types that are shared between modules yet are
// not in the public API.
//
typedef struct qd_server_t           qd_server_t;
typedef struct qd_container_t        qd_container_t;
typedef struct qd_waypoint_t         qd_waypoint_t;
typedef struct qd_lrp_container_t    qd_lrp_container_t;
typedef struct qd_lrp_t              qd_lrp_t;
typedef struct qd_router_link_t      qd_router_link_t;
typedef struct qd_router_node_t      qd_router_node_t;
typedef struct qd_router_ref_t       qd_router_ref_t;
typedef struct qd_router_link_ref_t  qd_router_link_ref_t;
typedef struct qd_router_lrp_ref_t   qd_router_lrp_ref_t;
typedef struct qd_router_conn_t      qd_router_conn_t;
typedef struct qd_config_phase_t     qd_config_phase_t;
typedef struct qd_config_address_t   qd_config_address_t;

#include <qpid/dispatch/container.h>
#include <qpid/dispatch/router.h>
#include <qpid/dispatch/connection_manager.h>
#include "policy.h"
#include "server_private.h"
#include "router_private.h"

struct qd_dispatch_t {
    qd_server_t             *server;
    qd_container_t          *container;
    qd_router_t             *router;
    void                    *agent;
    qd_connection_manager_t *connection_manager;
    qd_policy_t             *policy;
    void                    *dl_handle;

    int    thread_count;
    char  *sasl_config_path;
    char  *sasl_config_name;
    char  *router_area;
    char  *router_id;
    qd_router_mode_t  router_mode;
};

/**
 * Configure the AMQP container from a configuration entity.
 *
 * @param qd The dispatch handle returned by qd_dispatch
 * @param entity The configuration entity.
 */
qd_error_t qd_dispatch_configure_container(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure the router node from a configuration entity.
 * If this is not called, the router will run in ENDPOINT mode.
 *
 * @param qd The dispatch handle returned by qd_dispatch.
 * @param entity The configuration entity.
 */
qd_error_t qd_dispatch_configure_router(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Prepare Dispatch for operation.  This must be called prior to
 * calling qd_server_run or qd_server_start.
 *
 * @param qd The dispatch handle returned by qd_dispatch
 */
qd_error_t qd_dispatch_prepare(qd_dispatch_t *qd);

/**
 * Configure an address, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_configure_address(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure a waypoint, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_configure_waypoint(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure a link-route-pattern, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure a route, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_configure_route(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure security policy, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_configure_policy(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * Configure security policy manager, must be called after qd_dispatch_prepare
 */
qd_error_t qd_dispatch_register_policy_manager(qd_dispatch_t *qd, qd_entity_t *entity);

/**
 * \brief Configure the logging module from the
 *        parsed configuration file.  This must be called after the
 *        call to qd_dispatch_prepare completes.
 *
 * @param qd The dispatch handle returned by qd_dispatch
 */
qd_error_t qd_dispatch_configure_logging(qd_dispatch_t *qd);

/** Register a managed entity implementation with the management agent.
 * NOTE: impl must be unregistered before it is freed.
 */
void qd_dispatch_register_entity(qd_dispatch_t *qd, const char *type, void *impl);

/** Unregister a managed entity implementation */
void qd_dispatch_unregister_entity(qd_dispatch_t *qd, void *impl);

/** Set the agent */
void qd_dispatch_set_agent(qd_dispatch_t *qd, void *agent);

#endif
