/* SPDX-License-Identifier: LGPL-2.1-or-later */

#pragma once

#include "list.h"

typedef struct DnssdService DnssdService;
typedef struct DnssdTxtData DnssdTxtData;

typedef struct Manager Manager;
typedef struct DnsResourceRecord DnsResourceRecord;
typedef struct DnsTxtItem DnsTxtItem;

enum {
        DNS_TXT_ITEM_TEXT,
        DNS_TXT_ITEM_DATA
};

struct DnssdTxtData {
        DnsResourceRecord *rr;

        LIST_HEAD(DnsTxtItem, txt);

        LIST_FIELDS(DnssdTxtData, items);
};

struct DnssdService {
        char *filename;
        char *name;
        char *name_template;
        char *type;
        uint16_t port;
        uint16_t priority;
        uint16_t weight;

        DnsResourceRecord *ptr_rr;
        DnsResourceRecord *srv_rr;

        /* Section 6.8 of RFC 6763 allows having service
         * instances with multiple TXT resource records. */
        LIST_HEAD(DnssdTxtData, txt_data_items);

        Manager *manager;

        bool withdrawn:1;
        uid_t originator;
};

DnssdService *dnssd_service_free(DnssdService *service);
DnssdTxtData *dnssd_txtdata_free(DnssdTxtData *txt_data);
DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data);

DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);

int dnssd_render_instance_name(DnssdService *s, char **ret_name);
int dnssd_load(Manager *manager);
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);
int dnssd_update_rrs(DnssdService *s);
int dnssd_signal_conflict(Manager *manager, const char *name);
