/* Copyright 1999-2007 The Apache Software Foundation or its licensors, as
 * applicable.
 *
 * 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
 *
 *     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.
 */

/*
 * Original Copyright (c) Netmask.IT!® 2006-2007
 *
 * DNS Protocol module for Apache 2.x
 */

#ifndef RR_H
#define RR_H

#ifndef MOD_DNS_H
#include "mod_dns.h"
#endif

#ifdef  __cplusplus
 extern "C" {
#endif

#define DNS_RDATA_SERIALIZE(type) apr_status_t dns_rdata_##type##_serialize\
        (void *rdata, char *data, int *dlen)
#define DNS_RDATA_UNSERIALIZE(type) apr_status_t dns_rdata_##type##_unserialize\
        (apr_pool_t *pool, const char *data, void **rdata)
#define DNS_RDATA_PSERIALIZE(type) \
apr_status_t dns_rdata_##type##_pserialize(void *rdata, apr_pool_t *pool,\
                                           char **data, int *dlen)\
{\
    apr_status_t rv;\
    *dlen = 0;\
    if ((rv = dns_rdata_##type##_serialize(rdata, NULL, dlen)) != APR_SUCCESS)\
        return rv;\
    *data = apr_palloc(pool, *dlen);\
    return dns_rdata_##type##_serialize(rdata, *data, dlen);\
}

#define dns_init_rdata_const(type,var) \
    var->serialize = dns_rdata_##type.serialize;\
    var->pserialize = dns_rdata_##type.pserialize;\
    var->unserialize = dns_rdata_##type.unserialize

#define dns_init_rdata(type,var) \
    var->serialize = type->serialize;\
    var->pserialize = type->pserialize;\
    var->unserialize = type->unserialize

#define dns_null_rdata {NULL,NULL,NULL}

#define DNS_RDATA_DECLARE(type) DNS_DECLARE_DATA extern const dns_rdata_t dns_rdata_##type
#define DNS_RDATA_IMPLEMENT(type) DNS_DECLARE_DATA const dns_rdata_t dns_rdata_##type = {\
    NULL,\
    dns_rdata_##type##_serialize,\
    dns_rdata_##type##_pserialize,\
    dns_rdata_##type##_unserialize\
}

DNS_RDATA_DECLARE(a);
DNS_RDATA_DECLARE(cname);
DNS_RDATA_DECLARE(mx);

#ifdef __cplusplus
 }
#endif

#endif
