blob: e9424837e4186ae72e4db2b347a860c78e708593 [file] [log] [blame] [edit]
/*
* Copyright (c) 2021 Apple Inc. All rights reserved.
*
* Licensed 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
*
* https://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.
*/
#ifndef MDNS_ADDR_TAIL_QUEUE_H
#define MDNS_ADDR_TAIL_QUEUE_H
//======================================================================================================================
// MARK: - Headers
#include "nullability.h" // For NULLABLE and NONNULL.
#include "bsd_queue.h" // For STAILQ.
#include <stdlib.h>
#include <stdbool.h> // For bool.
#include "mDNSEmbeddedAPI.h" // For mDNSAddr, mDNSIPPort and mStatus.
#if defined(POSIX_BUILD)
#include "DebugServices.h"
#endif // defined(POSIX_BUILD)
//======================================================================================================================
// MARK: - Structures
typedef struct mdns_addr_with_port mdns_addr_with_port_t;
struct mdns_addr_with_port {
STAILQ_ENTRY(mdns_addr_with_port) __entries; // The entry used by STAILQ to form the linked list.
mDNSAddr address; // IPv4 or IPv6 address.
mDNSIPPort port; // The port number that is associated with the address above.
};
typedef struct mdns_addr_tailq mdns_addr_tailq_t;
// The tail queue struct mdns_addr_tailq that contains struct mdns_addr_with_port.
STAILQ_HEAD(mdns_addr_tailq, mdns_addr_with_port);
//======================================================================================================================
// MARK: - Function Declarations
/*!
* @brief
* Creates a tail queue that contains IP address and port number.
*
* @result
* A pointer to the tail queue or NULL if the system was out of memory.
*/
mdns_addr_tailq_t * NULLABLE
mdns_addr_tailq_create(void);
/*!
* @brief
* Disposes a tail queue that is created by <code>mdns_addr_tailq_create()</code>.
*
* @param me
* The tail queue that will be disposed.
*
* @discussion
* Use <code>MDNS_DISPOSE_MDNS_ADDR_TAILQ()</code> to dispose a tail queue safely.
*/
void
mdns_addr_tailq_dispose(mdns_addr_tailq_t * NONNULL me);
#define MDNS_DISPOSE_MDNS_ADDR_TAILQ(obj) _MDNS_STRICT_DISPOSE_TEMPLATE(obj, mdns_addr_tailq_dispose)
/*!
* @brief
* Checks if the current tail queue is empty.
*
* @param me
* The tail queue to be checked.
*
* @result
* True if the tail queue does not contain any element. Otherwise, false.
*/
bool
mdns_addr_tailq_empty(const mdns_addr_tailq_t * NONNULL me);
/*!
* @brief
* Adds an IP address with its corresponding port number into the front of the tail queue.
*
* @param me
* The tail queue where the address and port number to be added into.
*
* @param address
* The IP address to be added.
*
* @param port
* The corresponding port number of the added address to be added.
*
* @result
* The added address with its port number in the front of the tail queue, or NULL if the system was out of memory.
*/
const mdns_addr_with_port_t * NULLABLE
mdns_addr_tailq_add_front(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port);
/*!
* @brief
* Adds an IP address with its corresponding port number into the back of the tail queue.
*
* @param me
* The tail queue where the address and port number to be added into.
*
* @param address
* The IP address to be added.
*
* @param port
* The corresponding port number of the added address to be added.
*
* @result
* The added address with its port number in the back of the tail queue, or NULL if the system was out of memory.
*/
const mdns_addr_with_port_t * NULLABLE
mdns_addr_tailq_add_back(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port);
/*!
* @brief
* Gets the pointer to mdns_addr_with_port_t (which contains the IP address and port number added before) in the front of the tail queue.
*
* @param me
* The tail queue where the mdns_addr_with_port_t to be get from.
*
* @result
* The pointer to the mdns_addr_with_port_t in the front of the tail queue, or NULL if the tail queue is empty.
*/
const mdns_addr_with_port_t * NULLABLE
mdns_addr_tailq_get_front(const mdns_addr_tailq_t * NONNULL me);
/*!
* @brief
* Removes the first IP address and its port number in the front of the tail queue.
*
* @param me
* The tail queue where the IP address and its port number to be removed.
*/
void
mdns_addr_tailq_remove_front(mdns_addr_tailq_t * NONNULL me);
/*!
* @brief
* Removes mdns_addr_with_port_t object in the tail queue with the IP address and port number specified in the parameters.
*
* @param me
* The tail queue where the IP address and its port number to be removed.
*
* @param address
* The IP address to be matched.
*
* @param port
* The corresponding port number of the IP address to be matched.
*
* @result
* True if the mdns_addr_with_port_t object is found and removed from the tail queue, for the IP address and port number specified in the parameters.
* False if such mdns_addr_with_port_t object does not exist in the tail queue.
*/
bool
mdns_addr_tailq_remove(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port);
/*!
* @brief
* Checks if two mdns_addr_with_port_t object are equal in value.
*
* @param addr_1
* mdns_addr_with_port_t object to be compared.
*
* @param addr_2
* mdns_addr_with_port_t object to be compared.
*
* @result
* True if two mdns_addr_with_port_t are equal in value, otherwise, false.
*/
bool
mdns_addr_with_port_equal(const mdns_addr_with_port_t * NONNULL addr_1, const mdns_addr_with_port_t * NONNULL addr_2);
#endif // MDNS_ADDR_TAIL_QUEUE_H