/*
 * Copyright 1999-2014 University of Chicago
 *
 * 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.
 */

#ifndef GLOBUS_NET_MANAGER_ATTR_H
#define GLOBUS_NET_MANAGER_ATTR_H 1

#include "globus_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file globus_net_manager_attr.h
 * @brief Globus Network Manager Attributes
 */

/**
 * @defgroup globus_net_manager_attr Attributes
 * @ingroup globus_net_manager
 * @brief Net Manager Attribute Management Functions
 */

/**
 * @brief Net Manager Attributes
 * @ingroup globus_net_manager_attr
 * @details
 * The globus_net_manager_attr_t structure defines a scoped (attribute, value)
 * tuple. The scope in most cases is either the name of the transport driver
 * or the "globus_net_manager" scope, for attributes specific to the network
 * manager implementation.
 */
typedef struct globus_net_manager_attr_s
{
    /** Scope of the attribute */  
    char *                              scope;
    /** Name of the attribute */
    char *                              name;
    /** Value of the attribute */
    char *                              value;
}
globus_net_manager_attr_t;

/**
 * @brief End of attribute array static initializer
 * @ingroup globus_net_manager_attr
 * @hideinitializer
 */
#define GLOBUS_NET_MANAGER_NULL_ATTR { NULL, NULL, NULL }

extern const globus_net_manager_attr_t globus_net_manager_null_attr;

globus_result_t
globus_net_manager_attr_init(
    globus_net_manager_attr_t          *attr,
    const char                         *scope,
    const char                         *name,
    const char                         *value);

void
globus_net_manager_attr_destroy(
    globus_net_manager_attr_t          *attr);


globus_result_t
globus_net_manager_attr_array_from_string(
    globus_net_manager_attr_t         **attr,
    const char                         *scope,
    const char                         *attr_string);

globus_result_t
globus_net_manager_attr_array_copy(
    globus_net_manager_attr_t         **dest_array,
    const globus_net_manager_attr_t    *src_array);

void
globus_net_manager_attr_array_delete(
    globus_net_manager_attr_t          *attrs);

#ifdef __cplusplus
}
#endif

#endif /* #define GLOBUS_NET_MANAGER_ATTR_H */